2 # bash completion support for core Git.
4 # Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
5 # Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
6 # Distributed under the GNU General Public License, version 2.0.
8 # The contained completion routines provide support for completing:
10 # *) local and remote branch names
11 # *) local and remote tag names
12 # *) .git/remotes file names
13 # *) git 'subcommands'
14 # *) tree paths within 'ref:path/to/file' expressions
15 # *) common --long-options
17 # To use these routines:
19 # 1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
20 # 2) Added the following line to your .bashrc:
21 # source ~/.git-completion.sh
23 # 3) You may want to make sure the git executable is available
24 # in your PATH before this script is sourced, as some caching
25 # is performed while the script loads. If git isn't found
26 # at source time then all lookups will be done on demand,
27 # which may be slightly slower.
29 # 4) Consider changing your PS1 to also show the current branch:
30 # PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
32 # The argument to __git_ps1 will be displayed only if you
33 # are currently in a git repository. The %s token will be
34 # the name of the current branch.
38 # *) Read Documentation/SubmittingPatches
39 # *) Send all patches to the current maintainer:
41 # "Shawn O. Pearce" <spearce@spearce.org>
43 # *) Always CC the Git mailing list:
51 if [ -n "$__git_dir" ]; then
53 elif [ -d .git ]; then
56 git rev-parse --git-dir 2>/dev/null
58 elif [ -d "$1/.git" ]; then
67 local g="$(git rev-parse --git-dir 2>/dev/null)"
71 if [ -d "$g/../.dotest" ]
74 b="$(git symbolic-ref HEAD 2>/dev/null)"
75 elif [ -f "$g/.dotest-merge/interactive" ]
78 b="$(cat $g/.dotest-merge/head-name)"
79 elif [ -d "$g/.dotest-merge" ]
82 b="$(cat $g/.dotest-merge/head-name)"
83 elif [ -f "$g/MERGE_HEAD" ]
86 b="$(git symbolic-ref HEAD 2>/dev/null)"
88 if [ -f $g/BISECT_LOG ]
92 if ! b="$(git symbolic-ref HEAD 2>/dev/null)"
94 if ! b="$(git describe --exact-match HEAD 2>/dev/null)"
96 b="$(cut -c1-7 $g/HEAD)..."
102 printf "$1" "${b##refs/heads/}$r"
104 printf " (%s)" "${b##refs/heads/}$r"
111 local all c s=$'\n' IFS=' '$'\t'$'\n'
112 local cur="${COMP_WORDS[COMP_CWORD]}"
113 if [ $# -gt 2 ]; then
118 --*=*) all="$all$c$4$s" ;;
119 *.) all="$all$c$4$s" ;;
120 *) all="$all$c$4 $s" ;;
124 COMPREPLY=($(compgen -P "$2" -W "$all" -- "$cur"))
130 local cmd i is_hash=y dir="$(__gitdir "$1")"
131 if [ -d "$dir" ]; then
132 for i in $(git --git-dir="$dir" \
133 for-each-ref --format='%(refname)' \
135 echo "${i#refs/heads/}"
139 for i in $(git-ls-remote "$1" 2>/dev/null); do
140 case "$is_hash,$i" in
143 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
144 n,*) is_hash=y; echo "$i" ;;
151 local cmd i is_hash=y dir="$(__gitdir "$1")"
152 if [ -d "$dir" ]; then
153 for i in $(git --git-dir="$dir" \
154 for-each-ref --format='%(refname)' \
156 echo "${i#refs/tags/}"
160 for i in $(git-ls-remote "$1" 2>/dev/null); do
161 case "$is_hash,$i" in
164 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
165 n,*) is_hash=y; echo "$i" ;;
172 local cmd i is_hash=y dir="$(__gitdir "$1")"
173 if [ -d "$dir" ]; then
174 if [ -e "$dir/HEAD" ]; then echo HEAD; fi
175 for i in $(git --git-dir="$dir" \
176 for-each-ref --format='%(refname)' \
177 refs/tags refs/heads refs/remotes); do
179 refs/tags/*) echo "${i#refs/tags/}" ;;
180 refs/heads/*) echo "${i#refs/heads/}" ;;
181 refs/remotes/*) echo "${i#refs/remotes/}" ;;
187 for i in $(git-ls-remote "$dir" 2>/dev/null); do
188 case "$is_hash,$i" in
191 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
192 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
193 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
194 n,*) is_hash=y; echo "$i" ;;
202 for i in $(__git_refs "$1"); do
207 __git_refs_remotes ()
209 local cmd i is_hash=y
210 for i in $(git-ls-remote "$1" 2>/dev/null); do
211 case "$is_hash,$i" in
214 echo "$i:refs/remotes/$1/${i#refs/heads/}"
218 n,refs/tags/*) is_hash=y;;
226 local i ngoff IFS=$'\n' d="$(__gitdir)"
227 shopt -q nullglob || ngoff=1
229 for i in "$d/remotes"/*; do
230 echo ${i#$d/remotes/}
232 [ "$ngoff" ] && shopt -u nullglob
233 for i in $(git --git-dir="$d" config --list); do
243 __git_merge_strategies ()
245 if [ -n "$__git_merge_strategylist" ]; then
246 echo "$__git_merge_strategylist"
249 sed -n "/^all_strategies='/{
250 s/^all_strategies='//
254 }" "$(git --exec-path)/git-merge"
256 __git_merge_strategylist=
257 __git_merge_strategylist="$(__git_merge_strategies 2>/dev/null)"
259 __git_complete_file ()
261 local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
277 COMPREPLY=($(compgen -P "$pfx" \
278 -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
279 | sed '/^100... blob /s,^.* ,,
288 __gitcomp "$(__git_refs)"
293 __git_complete_revlist ()
295 local pfx cur="${COMP_WORDS[COMP_CWORD]}"
300 __gitcomp "$(__git_refs)" "$pfx" "$cur"
305 __gitcomp "$(__git_refs)" "$pfx" "$cur"
311 __gitcomp "$(__git_refs)"
318 if [ -n "$__git_commandlist" ]; then
319 echo "$__git_commandlist"
323 for i in $(git help -a|egrep '^ ')
326 *--*) : helper pattern;;
327 applymbox) : ask gittus;;
328 applypatch) : ask gittus;;
329 archimport) : import;;
330 cat-file) : plumbing;;
331 check-attr) : plumbing;;
332 check-ref-format) : plumbing;;
333 commit-tree) : plumbing;;
334 cvsexportcommit) : export;;
335 cvsimport) : import;;
336 cvsserver) : daemon;;
338 diff-files) : plumbing;;
339 diff-index) : plumbing;;
340 diff-tree) : plumbing;;
341 fast-import) : import;;
342 fsck-objects) : plumbing;;
343 fetch-pack) : plumbing;;
344 fmt-merge-msg) : plumbing;;
345 for-each-ref) : plumbing;;
346 hash-object) : plumbing;;
347 http-*) : transport;;
348 index-pack) : plumbing;;
349 init-db) : deprecated;;
350 local-fetch) : plumbing;;
351 mailinfo) : plumbing;;
352 mailsplit) : plumbing;;
353 merge-*) : plumbing;;
356 pack-objects) : plumbing;;
357 pack-redundant) : plumbing;;
358 pack-refs) : plumbing;;
359 parse-remote) : plumbing;;
360 patch-id) : plumbing;;
361 peek-remote) : plumbing;;
363 prune-packed) : plumbing;;
364 quiltimport) : import;;
365 read-tree) : plumbing;;
366 receive-pack) : plumbing;;
368 repo-config) : deprecated;;
370 rev-list) : plumbing;;
371 rev-parse) : plumbing;;
372 runstatus) : plumbing;;
373 sh-setup) : internal;;
375 send-pack) : plumbing;;
376 show-index) : plumbing;;
378 stripspace) : plumbing;;
379 svn) : import export;;
380 symbolic-ref) : plumbing;;
381 tar-tree) : deprecated;;
382 unpack-file) : plumbing;;
383 unpack-objects) : plumbing;;
384 update-index) : plumbing;;
385 update-ref) : plumbing;;
386 update-server-info) : daemon;;
387 upload-archive) : plumbing;;
388 upload-pack) : plumbing;;
389 write-tree) : plumbing;;
390 verify-tag) : plumbing;;
396 __git_commandlist="$(__git_commands 2>/dev/null)"
401 for i in $(git --git-dir="$(__gitdir)" config --list); do
411 __git_aliased_command ()
413 local word cmdline=$(git --git-dir="$(__gitdir)" \
414 config --get "alias.$1")
415 for word in $cmdline; do
416 if [ "${word##-*}" ]; then
423 __git_whitespacelist="nowarn warn error error-all strip"
427 local cur="${COMP_WORDS[COMP_CWORD]}"
428 if [ -d .dotest ]; then
429 __gitcomp "--skip --resolved"
434 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
439 --signoff --utf8 --binary --3way --interactive
449 local cur="${COMP_WORDS[COMP_CWORD]}"
452 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
457 --stat --numstat --summary --check --index
458 --cached --index-info --reverse --reject --unidiff-zero
459 --apply --no-add --exclude=
460 --whitespace= --inaccurate-eof --verbose
469 local cur="${COMP_WORDS[COMP_CWORD]}"
472 __gitcomp "--interactive --refresh"
481 while [ $c -lt $COMP_CWORD ]; do
484 start|bad|good|reset|visualize|replay|log)
492 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
493 __gitcomp "start bad good reset visualize replay log"
499 __gitcomp "$(__git_refs)"
509 local i c=1 only_local_ref="n" has_r="n"
511 while [ $c -lt $COMP_CWORD ]; do
514 -d|-m) only_local_ref="y" ;;
520 case "${COMP_WORDS[COMP_CWORD]}" in
521 --*=*) COMPREPLY=() ;;
524 --color --no-color --verbose --abbrev= --no-abbrev
529 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
530 __gitcomp "$(__git_heads)"
532 __gitcomp "$(__git_refs)"
540 local mycword="$COMP_CWORD"
541 case "${COMP_WORDS[0]}" in
543 local cmd="${COMP_WORDS[2]}"
544 mycword="$((mycword-1))"
547 local cmd="${COMP_WORDS[1]}"
552 __gitcomp "create list-heads verify unbundle"
560 __git_complete_revlist
569 __gitcomp "$(__git_refs)"
574 __gitcomp "$(__git_refs)"
579 local cur="${COMP_WORDS[COMP_CWORD]}"
582 __gitcomp "--edit --no-commit"
585 __gitcomp "$(__git_refs)"
592 local cur="${COMP_WORDS[COMP_CWORD]}"
596 --all --author= --signoff --verify --no-verify
597 --edit --amend --include --only
606 __gitcomp "$(__git_refs)"
611 local cur="${COMP_WORDS[COMP_CWORD]}"
614 __gitcomp "--cached --stat --numstat --shortstat --summary
615 --patch-with-stat --name-only --name-status --color
616 --no-color --color-words --no-renames --check
617 --full-index --binary --abbrev --diff-filter
618 --find-copies-harder --pickaxe-all --pickaxe-regex
619 --text --ignore-space-at-eol --ignore-space-change
620 --ignore-all-space --exit-code --quiet --ext-diff
630 __gitcomp "$(__git_refs)"
635 local cur="${COMP_WORDS[COMP_CWORD]}"
637 case "${COMP_WORDS[0]},$COMP_CWORD" in
639 __gitcomp "$(__git_remotes)"
642 __gitcomp "$(__git_remotes)"
647 __gitcomp "$(__git_refs)" "" "${cur#*:}"
651 case "${COMP_WORDS[0]}" in
652 git-fetch) remote="${COMP_WORDS[1]}" ;;
653 git) remote="${COMP_WORDS[2]}" ;;
655 __gitcomp "$(__git_refs2 "$remote")"
664 local cur="${COMP_WORDS[COMP_CWORD]}"
668 --stdout --attach --thread
670 --numbered --start-number
675 --full-index --binary
682 __git_complete_revlist
687 local cur="${COMP_WORDS[COMP_CWORD]}"
690 __gitcomp "--prune --aggressive"
699 __gitcomp "$(__git_remotes)"
709 local cur="${COMP_WORDS[COMP_CWORD]}"
713 oneline short medium full fuller email raw
714 " "" "${cur##--pretty=}"
719 relative iso8601 rfc2822 short local default
720 " "" "${cur##--date=}"
725 --max-count= --max-age= --since= --after=
726 --min-age= --before= --until=
727 --root --topo-order --date-order --reverse
729 --abbrev-commit --abbrev=
730 --relative-date --date=
731 --author= --committer= --grep=
733 --pretty= --name-status --name-only --raw
735 --left-right --cherry-pick
740 __git_complete_revlist
745 local cur="${COMP_WORDS[COMP_CWORD]}"
746 case "${COMP_WORDS[COMP_CWORD-1]}" in
748 __gitcomp "$(__git_merge_strategies)"
753 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
758 --no-commit --no-summary --squash --strategy
762 __gitcomp "$(__git_refs)"
767 __gitcomp "$(__git_refs)"
772 __gitcomp "--tags --all --stdin"
777 local cur="${COMP_WORDS[COMP_CWORD]}"
779 case "${COMP_WORDS[0]},$COMP_CWORD" in
781 __gitcomp "$(__git_remotes)"
784 __gitcomp "$(__git_remotes)"
788 case "${COMP_WORDS[0]}" in
789 git-pull) remote="${COMP_WORDS[1]}" ;;
790 git) remote="${COMP_WORDS[2]}" ;;
792 __gitcomp "$(__git_refs "$remote")"
799 local cur="${COMP_WORDS[COMP_CWORD]}"
801 case "${COMP_WORDS[0]},$COMP_CWORD" in
803 __gitcomp "$(__git_remotes)"
806 __gitcomp "$(__git_remotes)"
812 case "${COMP_WORDS[0]}" in
813 git-push) remote="${COMP_WORDS[1]}" ;;
814 git) remote="${COMP_WORDS[2]}" ;;
816 __gitcomp "$(__git_refs "$remote")" "" "${cur#*:}"
819 __gitcomp "$(__git_refs)" + "${cur#+}"
822 __gitcomp "$(__git_refs)"
831 local cur="${COMP_WORDS[COMP_CWORD]}"
832 if [ -d .dotest ] || [ -d .git/.dotest-merge ]; then
833 __gitcomp "--continue --skip --abort"
836 case "${COMP_WORDS[COMP_CWORD-1]}" in
838 __gitcomp "$(__git_merge_strategies)"
843 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
847 __gitcomp "--onto --merge --strategy"
850 __gitcomp "$(__git_refs)"
855 local cur="${COMP_WORDS[COMP_CWORD]}"
856 local prv="${COMP_WORDS[COMP_CWORD-1]}"
859 __gitcomp "$(__git_remotes)"
863 __gitcomp "$(__git_refs)"
867 local remote="${prv#remote.}"
868 remote="${remote%.fetch}"
869 __gitcomp "$(__git_refs_remotes "$remote")"
873 local remote="${prv#remote.}"
874 remote="${remote%.push}"
875 __gitcomp "$(git --git-dir="$(__gitdir)" \
876 for-each-ref --format='%(refname):%(refname)' \
880 pull.twohead|pull.octopus)
881 __gitcomp "$(__git_merge_strategies)"
884 color.branch|color.diff|color.status)
885 __gitcomp "always never auto"
890 black red green yellow blue magenta cyan white
891 bold dim ul blink reverse
903 --global --system --file=
905 --get --get-all --get-regexp
906 --add --unset --unset-all
907 --remove-section --rename-section
912 local pfx="${cur%.*}."
914 __gitcomp "remote merge" "$pfx" "$cur"
918 local pfx="${cur%.*}."
920 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
924 local pfx="${cur%.*}."
927 url fetch push skipDefaultUpdate
928 receivepack uploadpack tagopt
933 local pfx="${cur%.*}."
935 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
944 core.preferSymlinkRefs
945 core.logAllRefUpdates
946 core.loosecompression
947 core.repositoryFormatVersion
948 core.sharedRepository
949 core.warnAmbiguousRefs
952 core.packedGitWindowSize
967 color.diff.whitespace
973 color.status.untracked
982 gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dvpass
985 gc.reflogexpireunreachable
998 i18n.logOutputEncoding
1008 pack.deltaCacheLimit
1011 repack.useDeltaBaseOffset
1015 transfer.unpackLimit
1017 receive.denyNonFastForwards
1021 whatchanged.difftree
1029 while [ $c -lt $COMP_CWORD ]; do
1030 i="${COMP_WORDS[c]}"
1032 add|rm|show|prune|update) command="$i"; break ;;
1037 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
1038 __gitcomp "add rm show prune update"
1044 __gitcomp "$(__git_remotes)"
1047 local i c='' IFS=$'\n'
1048 for i in $(git --git-dir="$(__gitdir)" config --list); do
1066 local cur="${COMP_WORDS[COMP_CWORD]}"
1069 __gitcomp "--mixed --hard --soft"
1073 __gitcomp "$(__git_refs)"
1078 local cur="${COMP_WORDS[COMP_CWORD]}"
1082 --max-count= --max-age= --since= --after=
1083 --min-age= --before= --until=
1085 --author= --committer= --grep=
1088 --numbered --summary
1093 __git_complete_revlist
1098 local cur="${COMP_WORDS[COMP_CWORD]}"
1102 oneline short medium full fuller email raw
1103 " "" "${cur##--pretty=}"
1107 __gitcomp "--pretty="
1116 __gitcomp 'list show apply clear'
1122 while [ $c -lt $COMP_CWORD ]; do
1123 i="${COMP_WORDS[c]}"
1125 add|status|init|update) command="$i"; break ;;
1130 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
1131 local cur="${COMP_WORDS[COMP_CWORD]}"
1134 __gitcomp "--quiet --cached"
1137 __gitcomp "add status init update"
1147 while [ $c -lt $COMP_CWORD ]; do
1148 i="${COMP_WORDS[c]}"
1151 __gitcomp "$(__git_tags)"
1161 case "${COMP_WORDS[COMP_CWORD-1]}" in
1167 __gitcomp "$(__git_tags)"
1173 __gitcomp "$(__git_refs)"
1180 local i c=1 command __git_dir
1182 while [ $c -lt $COMP_CWORD ]; do
1183 i="${COMP_WORDS[c]}"
1185 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1186 --bare) __git_dir="." ;;
1187 --version|--help|-p|--paginate) ;;
1188 *) command="$i"; break ;;
1193 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
1194 case "${COMP_WORDS[COMP_CWORD]}" in
1195 --*=*) COMPREPLY=() ;;
1204 *) __gitcomp "$(__git_commands) $(__git_aliases)" ;;
1209 local expansion=$(__git_aliased_command "$command")
1210 [ "$expansion" ] && command="$expansion"
1215 apply) _git_apply ;;
1216 bisect) _git_bisect ;;
1217 bundle) _git_bundle ;;
1218 branch) _git_branch ;;
1219 checkout) _git_checkout ;;
1220 cherry) _git_cherry ;;
1221 cherry-pick) _git_cherry_pick ;;
1222 commit) _git_commit ;;
1223 config) _git_config ;;
1224 describe) _git_describe ;;
1226 fetch) _git_fetch ;;
1227 format-patch) _git_format_patch ;;
1230 ls-remote) _git_ls_remote ;;
1231 ls-tree) _git_ls_tree ;;
1233 merge-base) _git_merge_base ;;
1234 name-rev) _git_name_rev ;;
1237 rebase) _git_rebase ;;
1238 remote) _git_remote ;;
1239 reset) _git_reset ;;
1240 shortlog) _git_shortlog ;;
1242 show-branch) _git_log ;;
1243 stash) _git_stash ;;
1244 submodule) _git_submodule ;;
1246 whatchanged) _git_log ;;
1253 local cur="${COMP_WORDS[COMP_CWORD]}"
1256 __gitcomp "--not --all"
1260 __git_complete_revlist
1263 complete -o default -o nospace -F _git git
1264 complete -o default -o nospace -F _gitk gitk
1265 complete -o default -o nospace -F _git_am git-am
1266 complete -o default -o nospace -F _git_apply git-apply
1267 complete -o default -o nospace -F _git_bisect git-bisect
1268 complete -o default -o nospace -F _git_branch git-branch
1269 complete -o default -o nospace -F _git_bundle git-bundle
1270 complete -o default -o nospace -F _git_checkout git-checkout
1271 complete -o default -o nospace -F _git_cherry git-cherry
1272 complete -o default -o nospace -F _git_cherry_pick git-cherry-pick
1273 complete -o default -o nospace -F _git_commit git-commit
1274 complete -o default -o nospace -F _git_describe git-describe
1275 complete -o default -o nospace -F _git_diff git-diff
1276 complete -o default -o nospace -F _git_fetch git-fetch
1277 complete -o default -o nospace -F _git_format_patch git-format-patch
1278 complete -o default -o nospace -F _git_gc git-gc
1279 complete -o default -o nospace -F _git_log git-log
1280 complete -o default -o nospace -F _git_ls_remote git-ls-remote
1281 complete -o default -o nospace -F _git_ls_tree git-ls-tree
1282 complete -o default -o nospace -F _git_merge git-merge
1283 complete -o default -o nospace -F _git_merge_base git-merge-base
1284 complete -o default -o nospace -F _git_name_rev git-name-rev
1285 complete -o default -o nospace -F _git_pull git-pull
1286 complete -o default -o nospace -F _git_push git-push
1287 complete -o default -o nospace -F _git_rebase git-rebase
1288 complete -o default -o nospace -F _git_config git-config
1289 complete -o default -o nospace -F _git_remote git-remote
1290 complete -o default -o nospace -F _git_reset git-reset
1291 complete -o default -o nospace -F _git_shortlog git-shortlog
1292 complete -o default -o nospace -F _git_show git-show
1293 complete -o default -o nospace -F _git_stash git-stash
1294 complete -o default -o nospace -F _git_submodule git-submodule
1295 complete -o default -o nospace -F _git_log git-show-branch
1296 complete -o default -o nospace -F _git_tag git-tag
1297 complete -o default -o nospace -F _git_log git-whatchanged
1299 # The following are necessary only for Cygwin, and only are needed
1300 # when the user has tab-completed the executable name and consequently
1301 # included the '.exe' suffix.
1303 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1304 complete -o default -o nospace -F _git_add git-add.exe
1305 complete -o default -o nospace -F _git_apply git-apply.exe
1306 complete -o default -o nospace -F _git git.exe
1307 complete -o default -o nospace -F _git_branch git-branch.exe
1308 complete -o default -o nospace -F _git_bundle git-bundle.exe
1309 complete -o default -o nospace -F _git_cherry git-cherry.exe
1310 complete -o default -o nospace -F _git_describe git-describe.exe
1311 complete -o default -o nospace -F _git_diff git-diff.exe
1312 complete -o default -o nospace -F _git_format_patch git-format-patch.exe
1313 complete -o default -o nospace -F _git_log git-log.exe
1314 complete -o default -o nospace -F _git_ls_tree git-ls-tree.exe
1315 complete -o default -o nospace -F _git_merge_base git-merge-base.exe
1316 complete -o default -o nospace -F _git_name_rev git-name-rev.exe
1317 complete -o default -o nospace -F _git_push git-push.exe
1318 complete -o default -o nospace -F _git_config git-config
1319 complete -o default -o nospace -F _git_shortlog git-shortlog.exe
1320 complete -o default -o nospace -F _git_show git-show.exe
1321 complete -o default -o nospace -F _git_log git-show-branch.exe
1322 complete -o default -o nospace -F _git_tag git-tag.exe
1323 complete -o default -o nospace -F _git_log git-whatchanged.exe