#
# bash completion support for core Git.
#
-# Copyright (C) 2006 Shawn Pearce
+# Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
# Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
+# Distributed under the GNU General Public License, version 2.0.
#
# The contained completion routines provide support for completing:
#
# *) .git/remotes file names
# *) git 'subcommands'
# *) tree paths within 'ref:path/to/file' expressions
+# *) common --long-options
#
# To use these routines:
#
# are currently in a git repository. The %s token will be
# the name of the current branch.
#
+# To submit patches:
+#
+# *) Read Documentation/SubmittingPatches
+# *) Send all patches to the current maintainer:
+#
+# "Shawn O. Pearce" <spearce@spearce.org>
+#
+# *) Always CC the Git mailing list:
+#
+# git@vger.kernel.org
+#
+
+case "$COMP_WORDBREAKS" in
+*:*) : great ;;
+*) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
+esac
__gitdir ()
{
__git_ps1 ()
{
- local b="$(git symbolic-ref HEAD 2>/dev/null)"
- if [ -n "$b" ]; then
+ local g="$(git rev-parse --git-dir 2>/dev/null)"
+ if [ -n "$g" ]; then
+ local r
+ local b
+ if [ -d "$g/rebase-apply" ]
+ then
+ if test -f "$g/rebase-apply/rebasing"
+ then
+ r="|REBASE"
+ elif test -f "$g/rebase-apply/applying"
+ then
+ r="|AM"
+ else
+ r="|AM/REBASE"
+ fi
+ b="$(git symbolic-ref HEAD 2>/dev/null)"
+ elif [ -f "$g/rebase-merge/interactive" ]
+ then
+ r="|REBASE-i"
+ b="$(cat "$g/rebase-merge/head-name")"
+ elif [ -d "$g/rebase-merge" ]
+ then
+ r="|REBASE-m"
+ b="$(cat "$g/rebase-merge/head-name")"
+ elif [ -f "$g/MERGE_HEAD" ]
+ then
+ r="|MERGING"
+ b="$(git symbolic-ref HEAD 2>/dev/null)"
+ else
+ if [ -f "$g/BISECT_LOG" ]
+ then
+ r="|BISECTING"
+ fi
+ if ! b="$(git symbolic-ref HEAD 2>/dev/null)"
+ then
+ if ! b="$(git describe --exact-match HEAD 2>/dev/null)"
+ then
+ b="$(cut -c1-7 "$g/HEAD")..."
+ fi
+ fi
+ fi
+
if [ -n "$1" ]; then
- printf "$1" "${b##refs/heads/}"
+ printf "$1" "${b##refs/heads/}$r"
else
- printf " (%s)" "${b##refs/heads/}"
+ printf " (%s)" "${b##refs/heads/}$r"
fi
fi
}
+__gitcomp_1 ()
+{
+ local c IFS=' '$'\t'$'\n'
+ for c in $1; do
+ case "$c$2" in
+ --*=*) printf %s$'\n' "$c$2" ;;
+ *.) printf %s$'\n' "$c$2" ;;
+ *) printf %s$'\n' "$c$2 " ;;
+ esac
+ done
+}
+
+__gitcomp ()
+{
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ if [ $# -gt 2 ]; then
+ cur="$3"
+ fi
+ case "$cur" in
+ --*=)
+ COMPREPLY=()
+ ;;
+ *)
+ local IFS=$'\n'
+ COMPREPLY=($(compgen -P "$2" \
+ -W "$(__gitcomp_1 "$1" "$4")" \
+ -- "$cur"))
+ ;;
+ esac
+}
+
__git_heads ()
{
local cmd i is_hash=y dir="$(__gitdir "$1")"
done
return
fi
- for i in $(git-ls-remote "$1" 2>/dev/null); do
+ for i in $(git ls-remote "$1" 2>/dev/null); do
case "$is_hash,$i" in
y,*) is_hash=n ;;
n,*^{}) is_hash=y ;;
done
}
+__git_tags ()
+{
+ local cmd i is_hash=y dir="$(__gitdir "$1")"
+ if [ -d "$dir" ]; then
+ for i in $(git --git-dir="$dir" \
+ for-each-ref --format='%(refname)' \
+ refs/tags ); do
+ echo "${i#refs/tags/}"
+ done
+ return
+ fi
+ for i in $(git ls-remote "$1" 2>/dev/null); do
+ case "$is_hash,$i" in
+ y,*) is_hash=n ;;
+ n,*^{}) is_hash=y ;;
+ n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
+ n,*) is_hash=y; echo "$i" ;;
+ esac
+ done
+}
+
__git_refs ()
{
local cmd i is_hash=y dir="$(__gitdir "$1")"
done
return
fi
- for i in $(git-ls-remote "$dir" 2>/dev/null); do
+ for i in $(git ls-remote "$dir" 2>/dev/null); do
case "$is_hash,$i" in
y,*) is_hash=n ;;
n,*^{}) is_hash=y ;;
__git_refs_remotes ()
{
local cmd i is_hash=y
- for i in $(git-ls-remote "$1" 2>/dev/null); do
+ for i in $(git ls-remote "$1" 2>/dev/null); do
case "$is_hash,$i" in
n,refs/heads/*)
is_hash=y
echo ${i#$d/remotes/}
done
[ "$ngoff" ] && shopt -u nullglob
- for i in $(git --git-dir="$d" repo-config --list); do
+ for i in $(git --git-dir="$d" config --list); do
case "$i" in
remote.*.url=*)
i="${i#remote.}"
echo "$__git_merge_strategylist"
return
fi
- sed -n "/^all_strategies='/{
- s/^all_strategies='//
- s/'//
+ git merge -s help 2>&1 |
+ sed -n -e '/[Aa]vailable strategies are: /,/^$/{
+ s/\.$//
+ s/.*://
+ s/^[ ]*//
+ s/[ ]*$//
p
- q
- }" "$(git --exec-path)/git-merge"
+ }'
}
__git_merge_strategylist=
-__git_merge_strategylist="$(__git_merge_strategies 2>/dev/null)"
+__git_merge_strategylist=$(__git_merge_strategies 2>/dev/null)
__git_complete_file ()
{
ls="$ref"
;;
esac
+
+ case "$COMP_WORDBREAKS" in
+ *:*) : great ;;
+ *) pfx="$ref:$pfx" ;;
+ esac
+
+ local IFS=$'\n'
COMPREPLY=($(compgen -P "$pfx" \
-W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
- | sed '/^100... blob /s,^.* ,,
+ | sed '/^100... blob /{
+ s,^.* ,,
+ s,$, ,
+ }
+ /^120000 blob /{
+ s,^.* ,,
+ s,$, ,
+ }
/^040000 tree /{
s,^.* ,,
s,$,/,
-- "$cur"))
;;
*)
- COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
+ __gitcomp "$(__git_refs)"
;;
esac
}
*...*)
pfx="${cur%...*}..."
cur="${cur#*...}"
- COMPREPLY=($(compgen -P "$pfx" -W "$(__git_refs)" -- "$cur"))
+ __gitcomp "$(__git_refs)" "$pfx" "$cur"
;;
*..*)
pfx="${cur%..*}.."
cur="${cur#*..}"
- COMPREPLY=($(compgen -P "$pfx" -W "$(__git_refs)" -- "$cur"))
+ __gitcomp "$(__git_refs)" "$pfx" "$cur"
;;
*)
- COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
+ __gitcomp "$(__git_refs)"
;;
esac
}
-__git_commands ()
+__git_all_commands ()
{
- if [ -n "$__git_commandlist" ]; then
- echo "$__git_commandlist"
+ if [ -n "$__git_all_commandlist" ]; then
+ echo "$__git_all_commandlist"
return
fi
local i IFS=" "$'\n'
for i in $(git help -a|egrep '^ ')
do
case $i in
+ *--*) : helper pattern;;
+ *) echo $i;;
+ esac
+ done
+}
+__git_all_commandlist=
+__git_all_commandlist="$(__git_all_commands 2>/dev/null)"
+
+__git_porcelain_commands ()
+{
+ if [ -n "$__git_porcelain_commandlist" ]; then
+ echo "$__git_porcelain_commandlist"
+ return
+ fi
+ local i IFS=" "$'\n'
+ for i in "help" $(__git_all_commands)
+ do
+ case $i in
+ *--*) : helper pattern;;
+ applymbox) : ask gittus;;
+ applypatch) : ask gittus;;
+ archimport) : import;;
+ cat-file) : plumbing;;
+ check-attr) : plumbing;;
check-ref-format) : plumbing;;
+ checkout-index) : plumbing;;
commit-tree) : plumbing;;
- convert-objects) : plumbing;;
+ count-objects) : infrequent;;
+ cvsexportcommit) : export;;
+ cvsimport) : import;;
cvsserver) : daemon;;
daemon) : daemon;;
+ diff-files) : plumbing;;
+ diff-index) : plumbing;;
+ diff-tree) : plumbing;;
+ fast-import) : import;;
+ fast-export) : export;;
+ fsck-objects) : plumbing;;
fetch-pack) : plumbing;;
+ fmt-merge-msg) : plumbing;;
+ for-each-ref) : plumbing;;
hash-object) : plumbing;;
http-*) : transport;;
index-pack) : plumbing;;
+ init-db) : deprecated;;
local-fetch) : plumbing;;
+ lost-found) : infrequent;;
+ ls-files) : plumbing;;
+ ls-remote) : plumbing;;
+ ls-tree) : plumbing;;
mailinfo) : plumbing;;
mailsplit) : plumbing;;
merge-*) : plumbing;;
parse-remote) : plumbing;;
patch-id) : plumbing;;
peek-remote) : plumbing;;
+ prune) : plumbing;;
+ prune-packed) : plumbing;;
+ quiltimport) : import;;
read-tree) : plumbing;;
receive-pack) : plumbing;;
+ reflog) : plumbing;;
+ repo-config) : deprecated;;
rerere) : plumbing;;
rev-list) : plumbing;;
rev-parse) : plumbing;;
runstatus) : plumbing;;
sh-setup) : internal;;
shell) : daemon;;
+ show-ref) : plumbing;;
send-pack) : plumbing;;
show-index) : plumbing;;
ssh-*) : transport;;
stripspace) : plumbing;;
symbolic-ref) : plumbing;;
+ tar-tree) : deprecated;;
unpack-file) : plumbing;;
unpack-objects) : plumbing;;
+ update-index) : plumbing;;
update-ref) : plumbing;;
update-server-info) : daemon;;
upload-archive) : plumbing;;
upload-pack) : plumbing;;
write-tree) : plumbing;;
+ var) : infrequent;;
+ verify-pack) : infrequent;;
+ verify-tag) : plumbing;;
*) echo $i;;
esac
done
}
-__git_commandlist=
-__git_commandlist="$(__git_commands 2>/dev/null)"
+__git_porcelain_commandlist=
+__git_porcelain_commandlist="$(__git_porcelain_commands 2>/dev/null)"
__git_aliases ()
{
local i IFS=$'\n'
- for i in $(git --git-dir="$(__gitdir)" repo-config --list); do
+ for i in $(git --git-dir="$(__gitdir)" config --list); do
case "$i" in
alias.*)
i="${i#alias.}"
__git_aliased_command ()
{
local word cmdline=$(git --git-dir="$(__gitdir)" \
- repo-config --get "alias.$1")
+ config --get "alias.$1")
for word in $cmdline; do
if [ "${word##-*}" ]; then
echo $word
done
}
-__git_whitespacelist="nowarn warn error error-all strip"
+__git_find_subcommand ()
+{
+ local word subcommand c=1
+
+ while [ $c -lt $COMP_CWORD ]; do
+ word="${COMP_WORDS[c]}"
+ for subcommand in $1; do
+ if [ "$subcommand" = "$word" ]; then
+ echo "$subcommand"
+ return
+ fi
+ done
+ c=$((++c))
+ done
+}
+
+__git_has_doubledash ()
+{
+ local c=1
+ while [ $c -lt $COMP_CWORD ]; do
+ if [ "--" = "${COMP_WORDS[c]}" ]; then
+ return 0
+ fi
+ c=$((++c))
+ done
+ return 1
+}
+
+__git_whitespacelist="nowarn warn error error-all fix"
_git_am ()
{
- local cur="${COMP_WORDS[COMP_CWORD]}"
- if [ -d .dotest ]; then
- COMPREPLY=($(compgen -W "
- --skip --resolved
- " -- "$cur"))
+ local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
+ if [ -d "$dir"/rebase-apply ]; then
+ __gitcomp "--skip --resolved --abort"
return
fi
case "$cur" in
--whitespace=*)
- COMPREPLY=($(compgen -W "$__git_whitespacelist" \
- -- "${cur##--whitespace=}"))
+ __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
return
;;
--*)
- COMPREPLY=($(compgen -W "
+ __gitcomp "
--signoff --utf8 --binary --3way --interactive
--whitespace=
- " -- "$cur"))
+ "
return
esac
COMPREPLY=()
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
--whitespace=*)
- COMPREPLY=($(compgen -W "$__git_whitespacelist" \
- -- "${cur##--whitespace=}"))
+ __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
return
;;
--*)
- COMPREPLY=($(compgen -W "
+ __gitcomp "
--stat --numstat --summary --check --index
--cached --index-info --reverse --reject --unidiff-zero
--apply --no-add --exclude=
--whitespace= --inaccurate-eof --verbose
- " -- "$cur"))
+ "
return
esac
COMPREPLY=()
}
-_git_branch ()
+_git_add ()
{
+ __git_has_doubledash && return
+
local cur="${COMP_WORDS[COMP_CWORD]}"
- COMPREPLY=($(compgen -W "-l -f -d -D $(__git_refs)" -- "$cur"))
+ case "$cur" in
+ --*)
+ __gitcomp "
+ --interactive --refresh --patch --update --dry-run
+ --ignore-errors
+ "
+ return
+ esac
+ COMPREPLY=()
}
-_git_cat_file ()
+_git_archive ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
- case "${COMP_WORDS[0]},$COMP_CWORD" in
- git-cat-file*,1)
- COMPREPLY=($(compgen -W "-p -t blob tree commit tag" -- "$cur"))
+ case "$cur" in
+ --format=*)
+ __gitcomp "$(git archive --list)" "" "${cur##--format=}"
+ return
+ ;;
+ --remote=*)
+ __gitcomp "$(__git_remotes)" "" "${cur##--remote=}"
+ return
+ ;;
+ --*)
+ __gitcomp "
+ --format= --list --verbose
+ --prefix= --remote= --exec=
+ "
+ return
+ ;;
+ esac
+ __git_complete_file
+}
+
+_git_bisect ()
+{
+ __git_has_doubledash && return
+
+ local subcommands="start bad good skip reset visualize replay log run"
+ local subcommand="$(__git_find_subcommand "$subcommands")"
+ if [ -z "$subcommand" ]; then
+ __gitcomp "$subcommands"
+ return
+ fi
+
+ case "$subcommand" in
+ bad|good|reset|skip)
+ __gitcomp "$(__git_refs)"
+ ;;
+ *)
+ COMPREPLY=()
+ ;;
+ esac
+}
+
+_git_branch ()
+{
+ local i c=1 only_local_ref="n" has_r="n"
+
+ while [ $c -lt $COMP_CWORD ]; do
+ i="${COMP_WORDS[c]}"
+ case "$i" in
+ -d|-m) only_local_ref="y" ;;
+ -r) has_r="y" ;;
+ esac
+ c=$((++c))
+ done
+
+ case "${COMP_WORDS[COMP_CWORD]}" in
+ --*=*) COMPREPLY=() ;;
+ --*)
+ __gitcomp "
+ --color --no-color --verbose --abbrev= --no-abbrev
+ --track --no-track --contains --merged --no-merged
+ "
;;
- git,2)
- COMPREPLY=($(compgen -W "-p -t blob tree commit tag" -- "$cur"))
+ *)
+ if [ $only_local_ref = "y" -a $has_r = "n" ]; then
+ __gitcomp "$(__git_heads)"
+ else
+ __gitcomp "$(__git_refs)"
+ fi
+ ;;
+ esac
+}
+
+_git_bundle ()
+{
+ local cmd="${COMP_WORDS[2]}"
+ case "$COMP_CWORD" in
+ 2)
+ __gitcomp "create list-heads verify unbundle"
+ ;;
+ 3)
+ # looking for a file
;;
*)
- __git_complete_file
+ case "$cmd" in
+ create)
+ __git_complete_revlist
+ ;;
+ esac
;;
esac
}
_git_checkout ()
{
- local cur="${COMP_WORDS[COMP_CWORD]}"
- COMPREPLY=($(compgen -W "-l -b $(__git_refs)" -- "$cur"))
+ __git_has_doubledash && return
+
+ __gitcomp "$(__git_refs)"
+}
+
+_git_cherry ()
+{
+ __gitcomp "$(__git_refs)"
}
_git_cherry_pick ()
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
--*)
- COMPREPLY=($(compgen -W "
- --edit --no-commit
- " -- "$cur"))
+ __gitcomp "--edit --no-commit"
;;
*)
- COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
+ __gitcomp "$(__git_refs)"
;;
esac
}
+_git_clean ()
+{
+ __git_has_doubledash && return
+
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ case "$cur" in
+ --*)
+ __gitcomp "--dry-run --quiet"
+ return
+ ;;
+ esac
+ COMPREPLY=()
+}
+
+_git_clone ()
+{
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ case "$cur" in
+ --*)
+ __gitcomp "
+ --local
+ --no-hardlinks
+ --shared
+ --reference
+ --quiet
+ --no-checkout
+ --bare
+ --mirror
+ --origin
+ --upload-pack
+ --template=
+ --depth
+ "
+ return
+ ;;
+ esac
+ COMPREPLY=()
+}
+
_git_commit ()
{
+ __git_has_doubledash && return
+
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
--*)
- COMPREPLY=($(compgen -W "
+ __gitcomp "
--all --author= --signoff --verify --no-verify
- --edit --amend --include --only
- " -- "$cur"))
+ --edit --amend --include --only --interactive
+ "
return
esac
COMPREPLY=()
}
-_git_diff ()
+_git_describe ()
{
- __git_complete_file
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ case "$cur" in
+ --*)
+ __gitcomp "
+ --all --tags --contains --abbrev= --candidates=
+ --exact-match --debug --long --match --always
+ "
+ return
+ esac
+ __gitcomp "$(__git_refs)"
}
-_git_diff_tree ()
+_git_diff ()
{
+ __git_has_doubledash && return
+
local cur="${COMP_WORDS[COMP_CWORD]}"
- COMPREPLY=($(compgen -W "-r -p -M $(__git_refs)" -- "$cur"))
+ case "$cur" in
+ --*)
+ __gitcomp "--cached --stat --numstat --shortstat --summary
+ --patch-with-stat --name-only --name-status --color
+ --no-color --color-words --no-renames --check
+ --full-index --binary --abbrev --diff-filter=
+ --find-copies-harder --pickaxe-all --pickaxe-regex
+ --text --ignore-space-at-eol --ignore-space-change
+ --ignore-all-space --exit-code --quiet --ext-diff
+ --no-ext-diff
+ --no-prefix --src-prefix= --dst-prefix=
+ --base --ours --theirs
+ "
+ return
+ ;;
+ esac
+ __git_complete_file
}
_git_fetch ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
- case "${COMP_WORDS[0]},$COMP_CWORD" in
- git-fetch*,1)
- COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
- ;;
- git,2)
- COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
- ;;
- *)
+ if [ "$COMP_CWORD" = 2 ]; then
+ __gitcomp "$(__git_remotes)"
+ else
case "$cur" in
*:*)
- cur="${cur#*:}"
- COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
+ local pfx=""
+ case "$COMP_WORDBREAKS" in
+ *:*) : great ;;
+ *) pfx="${cur%%:*}:" ;;
+ esac
+ __gitcomp "$(__git_refs)" "$pfx" "${cur#*:}"
;;
*)
- local remote
- case "${COMP_WORDS[0]}" in
- git-fetch) remote="${COMP_WORDS[1]}" ;;
- git) remote="${COMP_WORDS[2]}" ;;
- esac
- COMPREPLY=($(compgen -W "$(__git_refs2 "$remote")" -- "$cur"))
+ __gitcomp "$(__git_refs2 "${COMP_WORDS[2]}")"
;;
esac
- ;;
- esac
+ fi
}
_git_format_patch ()
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
--*)
- COMPREPLY=($(compgen -W "
+ __gitcomp "
--stdout --attach --thread
--output-directory
--numbered --start-number
+ --numbered-files
--keep-subject
--signoff
--in-reply-to=
--full-index --binary
- " -- "$cur"))
+ --not --all
+ --cover-letter
+ --no-prefix --src-prefix= --dst-prefix=
+ "
return
;;
esac
__git_complete_revlist
}
-_git_ls_remote ()
+_git_gc ()
+{
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ case "$cur" in
+ --*)
+ __gitcomp "--prune --aggressive"
+ return
+ ;;
+ esac
+ COMPREPLY=()
+}
+
+_git_grep ()
+{
+ __git_has_doubledash && return
+
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ case "$cur" in
+ --*)
+ __gitcomp "
+ --cached
+ --text --ignore-case --word-regexp --invert-match
+ --full-name
+ --extended-regexp --basic-regexp --fixed-strings
+ --files-with-matches --name-only
+ --files-without-match
+ --count
+ --and --or --not --all-match
+ "
+ return
+ ;;
+ esac
+ COMPREPLY=()
+}
+
+_git_help ()
+{
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ case "$cur" in
+ --*)
+ __gitcomp "--all --info --man --web"
+ return
+ ;;
+ esac
+ __gitcomp "$(__git_all_commands)
+ attributes cli core-tutorial cvs-migration
+ diffcore gitk glossary hooks ignore modules
+ repository-layout tutorial tutorial-2
+ "
+}
+
+_git_init ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
- COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
+ case "$cur" in
+ --shared=*)
+ __gitcomp "
+ false true umask group all world everybody
+ " "" "${cur##--shared=}"
+ return
+ ;;
+ --*)
+ __gitcomp "--quiet --bare --template= --shared --shared="
+ return
+ ;;
+ esac
+ COMPREPLY=()
+}
+
+_git_ls_files ()
+{
+ __git_has_doubledash && return
+
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ case "$cur" in
+ --*)
+ __gitcomp "--cached --deleted --modified --others --ignored
+ --stage --directory --no-empty-directory --unmerged
+ --killed --exclude= --exclude-from=
+ --exclude-per-directory= --exclude-standard
+ --error-unmatch --with-tree= --full-name
+ --abbrev --ignored --exclude-per-directory
+ "
+ return
+ ;;
+ esac
+ COMPREPLY=()
+}
+
+_git_ls_remote ()
+{
+ __gitcomp "$(__git_remotes)"
}
_git_ls_tree ()
_git_log ()
{
+ __git_has_doubledash && return
+
local cur="${COMP_WORDS[COMP_CWORD]}"
case "$cur" in
--pretty=*)
- COMPREPLY=($(compgen -W "
+ __gitcomp "
oneline short medium full fuller email raw
- " -- "${cur##--pretty=}"))
+ " "" "${cur##--pretty=}"
+ return
+ ;;
+ --date=*)
+ __gitcomp "
+ relative iso8601 rfc2822 short local default
+ " "" "${cur##--date=}"
return
;;
--*)
- COMPREPLY=($(compgen -W "
+ __gitcomp "
--max-count= --max-age= --since= --after=
--min-age= --before= --until=
- --root --not --topo-order --date-order
- --no-merges
+ --root --topo-order --date-order --reverse
+ --no-merges --follow
--abbrev-commit --abbrev=
- --relative-date
+ --relative-date --date=
--author= --committer= --grep=
--all-match
- --pretty= --name-status --name-only
- " -- "$cur"))
+ --pretty= --name-status --name-only --raw
+ --not --all
+ --left-right --cherry-pick
+ --graph
+ --stat --numstat --shortstat
+ --decorate --diff-filter=
+ --color-words --walk-reflogs
+ --parents --children --full-history
+ --merge
+ "
return
;;
esac
local cur="${COMP_WORDS[COMP_CWORD]}"
case "${COMP_WORDS[COMP_CWORD-1]}" in
-s|--strategy)
- COMPREPLY=($(compgen -W "$(__git_merge_strategies)" -- "$cur"))
+ __gitcomp "$(__git_merge_strategies)"
return
esac
case "$cur" in
--strategy=*)
- COMPREPLY=($(compgen -W "$(__git_merge_strategies)" \
- -- "${cur##--strategy=}"))
+ __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
+ return
+ ;;
+ --*)
+ __gitcomp "
+ --no-commit --no-stat --log --no-log --squash --strategy
+ "
+ return
+ esac
+ __gitcomp "$(__git_refs)"
+}
+
+_git_mergetool ()
+{
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ case "$cur" in
+ --tool=*)
+ __gitcomp "
+ kdiff3 tkdiff meld xxdiff emerge
+ vimdiff gvimdiff ecmerge opendiff
+ " "" "${cur##--tool=}"
return
;;
--*)
- COMPREPLY=($(compgen -W "
- --no-commit --no-summary --squash --strategy
- " -- "$cur"))
+ __gitcomp "--tool="
return
+ ;;
esac
- COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
+ COMPREPLY=()
}
_git_merge_base ()
+{
+ __gitcomp "$(__git_refs)"
+}
+
+_git_mv ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
- COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
+ case "$cur" in
+ --*)
+ __gitcomp "--dry-run"
+ return
+ ;;
+ esac
+ COMPREPLY=()
}
_git_name_rev ()
{
- local cur="${COMP_WORDS[COMP_CWORD]}"
- COMPREPLY=($(compgen -W "--tags --all --stdin" -- "$cur"))
+ __gitcomp "--tags --all --stdin"
}
_git_pull ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
- case "${COMP_WORDS[0]},$COMP_CWORD" in
- git-pull*,1)
- COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
- ;;
- git,2)
- COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
- ;;
- *)
- local remote
- case "${COMP_WORDS[0]}" in
- git-pull) remote="${COMP_WORDS[1]}" ;;
- git) remote="${COMP_WORDS[2]}" ;;
- esac
- COMPREPLY=($(compgen -W "$(__git_refs "$remote")" -- "$cur"))
- ;;
- esac
+ if [ "$COMP_CWORD" = 2 ]; then
+ __gitcomp "$(__git_remotes)"
+ else
+ __gitcomp "$(__git_refs "${COMP_WORDS[2]}")"
+ fi
}
_git_push ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
- case "${COMP_WORDS[0]},$COMP_CWORD" in
- git-push*,1)
- COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
- ;;
- git,2)
- COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
- ;;
- *)
+ if [ "$COMP_CWORD" = 2 ]; then
+ __gitcomp "$(__git_remotes)"
+ else
case "$cur" in
*:*)
- local remote
- case "${COMP_WORDS[0]}" in
- git-push) remote="${COMP_WORDS[1]}" ;;
- git) remote="${COMP_WORDS[2]}" ;;
+ local pfx=""
+ case "$COMP_WORDBREAKS" in
+ *:*) : great ;;
+ *) pfx="${cur%%:*}:" ;;
esac
- cur="${cur#*:}"
- COMPREPLY=($(compgen -W "$(__git_refs "$remote")" -- "$cur"))
+
+ __gitcomp "$(__git_refs "${COMP_WORDS[2]}")" "$pfx" "${cur#*:}"
+ ;;
+ +*)
+ __gitcomp "$(__git_refs)" + "${cur#+}"
;;
*)
- COMPREPLY=($(compgen -W "$(__git_refs2)" -- "$cur"))
+ __gitcomp "$(__git_refs)"
;;
esac
- ;;
- esac
+ fi
}
_git_rebase ()
{
- local cur="${COMP_WORDS[COMP_CWORD]}"
- if [ -d .dotest ]; then
- COMPREPLY=($(compgen -W "
- --continue --skip --abort
- " -- "$cur"))
+ local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
+ if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
+ __gitcomp "--continue --skip --abort"
return
fi
case "${COMP_WORDS[COMP_CWORD-1]}" in
-s|--strategy)
- COMPREPLY=($(compgen -W "$(__git_merge_strategies)" -- "$cur"))
+ __gitcomp "$(__git_merge_strategies)"
return
esac
case "$cur" in
--strategy=*)
- COMPREPLY=($(compgen -W "$(__git_merge_strategies)" \
- -- "${cur##--strategy=}"))
+ __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
return
;;
--*)
- COMPREPLY=($(compgen -W "
- --onto --merge --strategy
- " -- "$cur"))
+ __gitcomp "--onto --merge --strategy --interactive"
return
esac
- COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
+ __gitcomp "$(__git_refs)"
}
-_git_repo_config ()
+_git_send_email ()
+{
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ case "$cur" in
+ --*)
+ __gitcomp "--bcc --cc --cc-cmd --chain-reply-to --compose
+ --dry-run --envelope-sender --from --identity
+ --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
+ --no-suppress-from --no-thread --quiet
+ --signed-off-by-cc --smtp-pass --smtp-server
+ --smtp-server-port --smtp-ssl --smtp-user --subject
+ --suppress-cc --suppress-from --thread --to"
+ return
+ ;;
+ esac
+ COMPREPLY=()
+}
+
+_git_config ()
{
local cur="${COMP_WORDS[COMP_CWORD]}"
local prv="${COMP_WORDS[COMP_CWORD-1]}"
case "$prv" in
branch.*.remote)
- COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
+ __gitcomp "$(__git_remotes)"
return
;;
branch.*.merge)
- COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
+ __gitcomp "$(__git_refs)"
return
;;
remote.*.fetch)
local remote="${prv#remote.}"
remote="${remote%.fetch}"
- COMPREPLY=($(compgen -W "$(__git_refs_remotes "$remote")" \
- -- "$cur"))
+ __gitcomp "$(__git_refs_remotes "$remote")"
return
;;
remote.*.push)
local remote="${prv#remote.}"
remote="${remote%.push}"
- COMPREPLY=($(compgen -W "$(git --git-dir="$(__gitdir)" \
+ __gitcomp "$(git --git-dir="$(__gitdir)" \
for-each-ref --format='%(refname):%(refname)' \
- refs/heads)" -- "$cur"))
+ refs/heads)"
+ return
+ ;;
+ pull.twohead|pull.octopus)
+ __gitcomp "$(__git_merge_strategies)"
+ return
+ ;;
+ color.branch|color.diff|color.status)
+ __gitcomp "always never auto"
+ return
+ ;;
+ color.*.*)
+ __gitcomp "
+ black red green yellow blue magenta cyan white
+ bold dim ul blink reverse
+ "
return
;;
*.*)
esac
case "$cur" in
--*)
- COMPREPLY=($(compgen -W "
- --global --list --replace-all
+ __gitcomp "
+ --global --system --file=
+ --list --replace-all
--get --get-all --get-regexp
- --unset --unset-all
- " -- "$cur"))
+ --add --unset --unset-all
+ --remove-section --rename-section
+ "
return
;;
branch.*.*)
local pfx="${cur%.*}."
cur="${cur##*.}"
- COMPREPLY=($(compgen -P "$pfx" -W "remote merge" -- "$cur"))
+ __gitcomp "remote merge" "$pfx" "$cur"
return
;;
branch.*)
local pfx="${cur%.*}."
cur="${cur#*.}"
- COMPREPLY=($(compgen -P "$pfx" -S . \
- -W "$(__git_heads)" -- "$cur"))
+ __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
return
;;
remote.*.*)
local pfx="${cur%.*}."
cur="${cur##*.}"
- COMPREPLY=($(compgen -P "$pfx" -W "url fetch push" -- "$cur"))
+ __gitcomp "
+ url fetch push skipDefaultUpdate
+ receivepack uploadpack tagopt
+ " "$pfx" "$cur"
return
;;
remote.*)
local pfx="${cur%.*}."
cur="${cur#*.}"
- COMPREPLY=($(compgen -P "$pfx" -S . \
- -W "$(__git_remotes)" -- "$cur"))
+ __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
return
;;
esac
- COMPREPLY=($(compgen -W "
+ __gitcomp "
apply.whitespace
core.fileMode
core.gitProxy
core.ignoreStat
core.preferSymlinkRefs
core.logAllRefUpdates
+ core.loosecompression
core.repositoryFormatVersion
core.sharedRepository
core.warnAmbiguousRefs
core.compression
- core.legacyHeaders
- i18n.commitEncoding
- diff.color
+ core.packedGitWindowSize
+ core.packedGitLimit
+ clean.requireForce
+ color.branch
+ color.branch.current
+ color.branch.local
+ color.branch.remote
+ color.branch.plain
+ color.diff
+ color.diff.plain
+ color.diff.meta
+ color.diff.frag
+ color.diff.old
+ color.diff.new
+ color.diff.commit
+ color.diff.whitespace
+ color.pager
+ color.status
+ color.status.header
+ color.status.added
+ color.status.changed
+ color.status.untracked
diff.renameLimit
diff.renames
- pager.color
- status.color
- log.showroot
- show.difftree
- showbranch.default
- whatchanged.difftree
+ fetch.unpackLimit
+ format.headers
+ format.subjectprefix
+ gitcvs.enabled
+ gitcvs.logfile
+ gitcvs.allbinary
+ gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dbpass
+ gitcvs.dbtablenameprefix
+ gc.packrefs
+ gc.reflogexpire
+ gc.reflogexpireunreachable
+ gc.rerereresolved
+ gc.rerereunresolved
http.sslVerify
http.sslCert
http.sslKey
http.sslCAInfo
http.sslCAPath
http.maxRequests
- http.lowSpeedLimit http.lowSpeedTime
+ http.lowSpeedLimit
+ http.lowSpeedTime
http.noEPSV
+ i18n.commitEncoding
+ i18n.logOutputEncoding
+ log.showroot
+ merge.tool
+ merge.summary
+ merge.verbosity
pack.window
+ pack.depth
+ pack.windowMemory
+ pack.compression
+ pack.deltaCacheSize
+ pack.deltaCacheLimit
+ pull.octopus
+ pull.twohead
repack.useDeltaBaseOffset
- pull.octopus pull.twohead
- merge.summary
+ showbranch.default
+ tar.umask
+ transfer.unpackLimit
receive.unpackLimit
receive.denyNonFastForwards
- user.name user.email
- tar.umask
- gitcvs.enabled
- gitcvs.logfile
+ user.name
+ user.email
+ user.signingkey
branch. remote.
- " -- "$cur"))
+ "
+}
+
+_git_remote ()
+{
+ local subcommands="add rm show prune update"
+ local subcommand="$(__git_find_subcommand "$subcommands")"
+ if [ -z "$subcommand" ]; then
+ __gitcomp "$subcommands"
+ return
+ fi
+
+ case "$subcommand" in
+ rm|show|prune)
+ __gitcomp "$(__git_remotes)"
+ ;;
+ update)
+ local i c='' IFS=$'\n'
+ for i in $(git --git-dir="$(__gitdir)" config --list); do
+ case "$i" in
+ remotes.*)
+ i="${i#remotes.}"
+ c="$c ${i/=*/}"
+ ;;
+ esac
+ done
+ __gitcomp "$c"
+ ;;
+ *)
+ COMPREPLY=()
+ ;;
+ esac
}
_git_reset ()
{
+ __git_has_doubledash && return
+
local cur="${COMP_WORDS[COMP_CWORD]}"
- local opt="--mixed --hard --soft"
- COMPREPLY=($(compgen -W "$opt $(__git_refs)" -- "$cur"))
+ case "$cur" in
+ --*)
+ __gitcomp "--mixed --hard --soft"
+ return
+ ;;
+ esac
+ __gitcomp "$(__git_refs)"
+}
+
+_git_revert ()
+{
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ case "$cur" in
+ --*)
+ __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
+ return
+ ;;
+ esac
+ __gitcomp "$(__git_refs)"
+}
+
+_git_rm ()
+{
+ __git_has_doubledash && return
+
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ case "$cur" in
+ --*)
+ __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
+ return
+ ;;
+ esac
+ COMPREPLY=()
+}
+
+_git_shortlog ()
+{
+ __git_has_doubledash && return
+
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ case "$cur" in
+ --*)
+ __gitcomp "
+ --max-count= --max-age= --since= --after=
+ --min-age= --before= --until=
+ --no-merges
+ --author= --committer= --grep=
+ --all-match
+ --not --all
+ --numbered --summary
+ "
+ return
+ ;;
+ esac
+ __git_complete_revlist
+}
+
+_git_show ()
+{
+ __git_has_doubledash && return
+
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ case "$cur" in
+ --pretty=*)
+ __gitcomp "
+ oneline short medium full fuller email raw
+ " "" "${cur##--pretty=}"
+ return
+ ;;
+ --*)
+ __gitcomp "--pretty="
+ return
+ ;;
+ esac
+ __git_complete_file
+}
+
+_git_show_branch ()
+{
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ case "$cur" in
+ --*)
+ __gitcomp "
+ --all --remotes --topo-order --current --more=
+ --list --independent --merge-base --no-name
+ --sha1-name --topics --reflog
+ "
+ return
+ ;;
+ esac
+ __git_complete_revlist
+}
+
+_git_stash ()
+{
+ local subcommands='save list show apply clear drop pop create branch'
+ local subcommand="$(__git_find_subcommand "$subcommands")"
+ if [ -z "$subcommand" ]; then
+ __gitcomp "$subcommands"
+ else
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ case "$subcommand,$cur" in
+ save,--*)
+ __gitcomp "--keep-index"
+ ;;
+ apply,--*)
+ __gitcomp "--index"
+ ;;
+ show,--*|drop,--*|pop,--*|branch,--*)
+ COMPREPLY=()
+ ;;
+ show,*|apply,*|drop,*|pop,*|branch,*)
+ __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
+ | sed -n -e 's/:.*//p')"
+ ;;
+ *)
+ COMPREPLY=()
+ ;;
+ esac
+ fi
+}
+
+_git_submodule ()
+{
+ __git_has_doubledash && return
+
+ local subcommands="add status init update"
+ if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ case "$cur" in
+ --*)
+ __gitcomp "--quiet --cached"
+ ;;
+ *)
+ __gitcomp "$subcommands"
+ ;;
+ esac
+ return
+ fi
+}
+
+_git_svn ()
+{
+ local subcommands="
+ init fetch clone rebase dcommit log find-rev
+ set-tree commit-diff info create-ignore propget
+ proplist show-ignore show-externals
+ "
+ local subcommand="$(__git_find_subcommand "$subcommands")"
+ if [ -z "$subcommand" ]; then
+ __gitcomp "$subcommands"
+ else
+ local remote_opts="--username= --config-dir= --no-auth-cache"
+ local fc_opts="
+ --follow-parent --authors-file= --repack=
+ --no-metadata --use-svm-props --use-svnsync-props
+ --log-window-size= --no-checkout --quiet
+ --repack-flags --user-log-author $remote_opts
+ "
+ local init_opts="
+ --template= --shared= --trunk= --tags=
+ --branches= --stdlayout --minimize-url
+ --no-metadata --use-svm-props --use-svnsync-props
+ --rewrite-root= $remote_opts
+ "
+ local cmt_opts="
+ --edit --rmdir --find-copies-harder --copy-similarity=
+ "
+
+ local cur="${COMP_WORDS[COMP_CWORD]}"
+ case "$subcommand,$cur" in
+ fetch,--*)
+ __gitcomp "--revision= --fetch-all $fc_opts"
+ ;;
+ clone,--*)
+ __gitcomp "--revision= $fc_opts $init_opts"
+ ;;
+ init,--*)
+ __gitcomp "$init_opts"
+ ;;
+ dcommit,--*)
+ __gitcomp "
+ --merge --strategy= --verbose --dry-run
+ --fetch-all --no-rebase $cmt_opts $fc_opts
+ "
+ ;;
+ set-tree,--*)
+ __gitcomp "--stdin $cmt_opts $fc_opts"
+ ;;
+ create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
+ show-externals,--*)
+ __gitcomp "--revision="
+ ;;
+ log,--*)
+ __gitcomp "
+ --limit= --revision= --verbose --incremental
+ --oneline --show-commit --non-recursive
+ --authors-file=
+ "
+ ;;
+ rebase,--*)
+ __gitcomp "
+ --merge --verbose --strategy= --local
+ --fetch-all $fc_opts
+ "
+ ;;
+ commit-diff,--*)
+ __gitcomp "--message= --file= --revision= $cmt_opts"
+ ;;
+ info,--*)
+ __gitcomp "--url"
+ ;;
+ *)
+ COMPREPLY=()
+ ;;
+ esac
+ fi
+}
+
+_git_tag ()
+{
+ local i c=1 f=0
+ while [ $c -lt $COMP_CWORD ]; do
+ i="${COMP_WORDS[c]}"
+ case "$i" in
+ -d|-v)
+ __gitcomp "$(__git_tags)"
+ return
+ ;;
+ -f)
+ f=1
+ ;;
+ esac
+ c=$((++c))
+ done
+
+ case "${COMP_WORDS[COMP_CWORD-1]}" in
+ -m|-F)
+ COMPREPLY=()
+ ;;
+ -*|tag)
+ if [ $f = 1 ]; then
+ __gitcomp "$(__git_tags)"
+ else
+ COMPREPLY=()
+ fi
+ ;;
+ *)
+ __gitcomp "$(__git_refs)"
+ ;;
+ esac
}
_git ()
case "$i" in
--git-dir=*) __git_dir="${i#--git-dir=}" ;;
--bare) __git_dir="." ;;
- --version|--help|-p|--paginate) ;;
+ --version|-p|--paginate) ;;
+ --help) command="help"; break ;;
*) command="$i"; break ;;
esac
c=$((++c))
done
- if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
- COMPREPLY=($(compgen -W "
- --git-dir= --version --exec-path
- $(__git_commands)
- $(__git_aliases)
- " -- "${COMP_WORDS[COMP_CWORD]}"))
- return;
+ if [ -z "$command" ]; then
+ case "${COMP_WORDS[COMP_CWORD]}" in
+ --*=*) COMPREPLY=() ;;
+ --*) __gitcomp "
+ --paginate
+ --no-pager
+ --git-dir=
+ --bare
+ --version
+ --exec-path
+ --work-tree=
+ --help
+ "
+ ;;
+ *) __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
+ esac
+ return
fi
local expansion=$(__git_aliased_command "$command")
case "$command" in
am) _git_am ;;
+ add) _git_add ;;
apply) _git_apply ;;
+ archive) _git_archive ;;
+ bisect) _git_bisect ;;
+ bundle) _git_bundle ;;
branch) _git_branch ;;
- cat-file) _git_cat_file ;;
checkout) _git_checkout ;;
+ cherry) _git_cherry ;;
cherry-pick) _git_cherry_pick ;;
+ clean) _git_clean ;;
+ clone) _git_clone ;;
commit) _git_commit ;;
+ config) _git_config ;;
+ describe) _git_describe ;;
diff) _git_diff ;;
- diff-tree) _git_diff_tree ;;
fetch) _git_fetch ;;
format-patch) _git_format_patch ;;
+ gc) _git_gc ;;
+ grep) _git_grep ;;
+ help) _git_help ;;
+ init) _git_init ;;
log) _git_log ;;
+ ls-files) _git_ls_files ;;
ls-remote) _git_ls_remote ;;
ls-tree) _git_ls_tree ;;
merge) _git_merge;;
+ mergetool) _git_mergetool;;
merge-base) _git_merge_base ;;
+ mv) _git_mv ;;
name-rev) _git_name_rev ;;
pull) _git_pull ;;
push) _git_push ;;
rebase) _git_rebase ;;
- repo-config) _git_repo_config ;;
+ remote) _git_remote ;;
reset) _git_reset ;;
- show) _git_log ;;
- show-branch) _git_log ;;
+ revert) _git_revert ;;
+ rm) _git_rm ;;
+ send-email) _git_send_email ;;
+ shortlog) _git_shortlog ;;
+ show) _git_show ;;
+ show-branch) _git_show_branch ;;
+ stash) _git_stash ;;
+ submodule) _git_submodule ;;
+ svn) _git_svn ;;
+ tag) _git_tag ;;
whatchanged) _git_log ;;
*) COMPREPLY=() ;;
esac
_gitk ()
{
+ __git_has_doubledash && return
+
local cur="${COMP_WORDS[COMP_CWORD]}"
- COMPREPLY=($(compgen -W "--all $(__git_refs)" -- "$cur"))
+ local g="$(git rev-parse --git-dir 2>/dev/null)"
+ local merge=""
+ if [ -f $g/MERGE_HEAD ]; then
+ merge="--merge"
+ fi
+ case "$cur" in
+ --*)
+ __gitcomp "--not --all $merge"
+ return
+ ;;
+ esac
+ __git_complete_revlist
}
complete -o default -o nospace -F _git git
-complete -o default -F _gitk gitk
-complete -o default -F _git_am git-am
-complete -o default -F _git_apply git-apply
-complete -o default -F _git_branch git-branch
-complete -o default -o nospace -F _git_cat_file git-cat-file
-complete -o default -F _git_checkout git-checkout
-complete -o default -F _git_cherry_pick git-cherry-pick
-complete -o default -F _git_commit git-commit
-complete -o default -o nospace -F _git_diff git-diff
-complete -o default -F _git_diff_tree git-diff-tree
-complete -o default -o nospace -F _git_fetch git-fetch
-complete -o default -o nospace -F _git_format_patch git-format-patch
-complete -o default -o nospace -F _git_log git-log
-complete -o default -F _git_ls_remote git-ls-remote
-complete -o default -o nospace -F _git_ls_tree git-ls-tree
-complete -o default -F _git_merge git-merge
-complete -o default -F _git_merge_base git-merge-base
-complete -o default -F _git_name_rev git-name-rev
-complete -o default -o nospace -F _git_pull git-pull
-complete -o default -o nospace -F _git_push git-push
-complete -o default -F _git_rebase git-rebase
-complete -o default -F _git_repo_config git-repo-config
-complete -o default -F _git_reset git-reset
-complete -o default -F _git_log git-show
-complete -o default -o nospace -F _git_log git-show-branch
-complete -o default -o nospace -F _git_log git-whatchanged
+complete -o default -o nospace -F _gitk gitk
# The following are necessary only for Cygwin, and only are needed
# when the user has tab-completed the executable name and consequently
# included the '.exe' suffix.
#
if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
-complete -o default -F _git_apply git-apply.exe
complete -o default -o nospace -F _git git.exe
-complete -o default -F _git_branch git-branch.exe
-complete -o default -o nospace -F _git_cat_file git-cat-file.exe
-complete -o default -o nospace -F _git_diff git-diff.exe
-complete -o default -o nospace -F _git_diff_tree git-diff-tree.exe
-complete -o default -o nospace -F _git_format_patch git-format-patch.exe
-complete -o default -o nospace -F _git_log git-log.exe
-complete -o default -o nospace -F _git_ls_tree git-ls-tree.exe
-complete -o default -F _git_merge_base git-merge-base.exe
-complete -o default -F _git_name_rev git-name-rev.exe
-complete -o default -o nospace -F _git_push git-push.exe
-complete -o default -F _git_repo_config git-repo-config
-complete -o default -o nospace -F _git_log git-show.exe
-complete -o default -o nospace -F _git_log git-show-branch.exe
-complete -o default -o nospace -F _git_log git-whatchanged.exe
fi