3 # bash/zsh completion support for core Git.
5 # Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
6 # Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
7 # Distributed under the GNU General Public License, version 2.0.
9 # The contained completion routines provide support for completing:
11 # *) local and remote branch names
12 # *) local and remote tag names
13 # *) .git/remotes file names
14 # *) git 'subcommands'
15 # *) tree paths within 'ref:path/to/file' expressions
16 # *) common --long-options
18 # To use these routines:
20 # 1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
21 # 2) Add the following line to your .bashrc/.zshrc:
22 # source ~/.git-completion.sh
24 # 3) Consider changing your PS1 to also show the current branch:
25 # Bash: PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
26 # ZSH: PS1='[%n@%m %c$(__git_ps1 " (%s)")]\$ '
28 # The argument to __git_ps1 will be displayed only if you
29 # are currently in a git repository. The %s token will be
30 # the name of the current branch.
32 # In addition, if you set GIT_PS1_SHOWDIRTYSTATE to a nonempty
33 # value, unstaged (*) and staged (+) changes will be shown next
34 # to the branch name. You can configure this per-repository
35 # with the bash.showDirtyState variable, which defaults to true
36 # once GIT_PS1_SHOWDIRTYSTATE is enabled.
38 # You can also see if currently something is stashed, by setting
39 # GIT_PS1_SHOWSTASHSTATE to a nonempty value. If something is stashed,
40 # then a '$' will be shown next to the branch name.
42 # If you would like to see if there're untracked files, then you can
43 # set GIT_PS1_SHOWUNTRACKEDFILES to a nonempty value. If there're
44 # untracked files, then a '%' will be shown next to the branch name.
46 # If you would like to see the difference between HEAD and its
47 # upstream, set GIT_PS1_SHOWUPSTREAM="auto". A "<" indicates
48 # you are behind, ">" indicates you are ahead, and "<>"
49 # indicates you have diverged. You can further control
50 # behaviour by setting GIT_PS1_SHOWUPSTREAM to a space-separated
52 # verbose show number of commits ahead/behind (+/-) upstream
53 # legacy don't use the '--count' option available in recent
54 # versions of git-rev-list
55 # git always compare HEAD to @{upstream}
56 # svn always compare HEAD to your SVN upstream
57 # By default, __git_ps1 will compare HEAD to your SVN upstream
58 # if it can find one, or @{upstream} otherwise. Once you have
59 # set GIT_PS1_SHOWUPSTREAM, you can override it on a
60 # per-repository basis by setting the bash.showUpstream config
66 # *) Read Documentation/SubmittingPatches
67 # *) Send all patches to the current maintainer:
69 # "Shawn O. Pearce" <spearce@spearce.org>
71 # *) Always CC the Git mailing list:
76 if [[ -n ${ZSH_VERSION-} ]]; then
77 autoload -U +X bashcompinit && bashcompinit
80 case "$COMP_WORDBREAKS" in
82 *) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
85 # __gitdir accepts 0 or 1 arguments (i.e., location)
86 # returns location of .git repo
89 if [ -z "${1-}" ]; then
90 if [ -n "${__git_dir-}" ]; then
92 elif [ -d .git ]; then
95 git rev-parse --git-dir 2>/dev/null
97 elif [ -d "$1/.git" ]; then
104 # stores the divergence from upstream in $p
105 # used by GIT_PS1_SHOWUPSTREAM
106 __git_ps1_show_upstream ()
109 local svn_remote svn_url_pattern count n
110 local upstream=git legacy="" verbose=""
113 # get some config options from git-config
114 local output="$(git config -z --get-regexp '^(svn-remote\..*\.url|bash\.showupstream)$' 2>/dev/null | tr '\0\n' '\n ')"
115 while read -r key value; do
118 GIT_PS1_SHOWUPSTREAM="$value"
119 if [[ -z "${GIT_PS1_SHOWUPSTREAM}" ]]; then
125 svn_remote[ $((${#svn_remote[@]} + 1)) ]="$value"
126 svn_url_pattern+="\\|$value"
127 upstream=svn+git # default upstream is SVN if available, else git
132 # parse configuration values
133 for option in ${GIT_PS1_SHOWUPSTREAM}; do
135 git|svn) upstream="$option" ;;
136 verbose) verbose=1 ;;
143 git) upstream="@{upstream}" ;;
145 # get the upstream from the "git-svn-id: ..." in a commit message
146 # (git-svn uses essentially the same procedure internally)
147 local svn_upstream=($(git log --first-parent -1 \
148 --grep="^git-svn-id: \(${svn_url_pattern#??}\)" 2>/dev/null))
149 if [[ 0 -ne ${#svn_upstream[@]} ]]; then
150 svn_upstream=${svn_upstream[ ${#svn_upstream[@]} - 2 ]}
151 svn_upstream=${svn_upstream%@*}
152 local n_stop="${#svn_remote[@]}"
153 for ((n=1; n <= n_stop; ++n)); do
154 svn_upstream=${svn_upstream#${svn_remote[$n]}}
157 if [[ -z "$svn_upstream" ]]; then
158 # default branch name for checkouts with no layout:
159 upstream=${GIT_SVN_ID:-git-svn}
161 upstream=${svn_upstream#/}
163 elif [[ "svn+git" = "$upstream" ]]; then
164 upstream="@{upstream}"
169 # Find how many commits we are ahead/behind our upstream
170 if [[ -z "$legacy" ]]; then
171 count="$(git rev-list --count --left-right \
172 "$upstream"...HEAD 2>/dev/null)"
174 # produce equivalent output to --count for older versions of git
176 if commits="$(git rev-list --left-right "$upstream"...HEAD 2>/dev/null)"
178 local commit behind=0 ahead=0
179 for commit in $commits
188 count="$behind $ahead"
194 # calculate the result
195 if [[ -z "$verbose" ]]; then
199 "0 0") # equal to upstream
201 "0 "*) # ahead of upstream
203 *" 0") # behind upstream
205 *) # diverged from upstream
212 "0 0") # equal to upstream
214 "0 "*) # ahead of upstream
215 p=" u+${count#0 }" ;;
216 *" 0") # behind upstream
217 p=" u-${count% 0}" ;;
218 *) # diverged from upstream
219 p=" u+${count#* }-${count% *}" ;;
226 # __git_ps1 accepts 0 or 1 arguments (i.e., format string)
227 # returns text to add to bash PS1 prompt (includes branch name)
230 local g="$(__gitdir)"
234 if [ -f "$g/rebase-merge/interactive" ]; then
236 b="$(cat "$g/rebase-merge/head-name")"
237 elif [ -d "$g/rebase-merge" ]; then
239 b="$(cat "$g/rebase-merge/head-name")"
241 if [ -d "$g/rebase-apply" ]; then
242 if [ -f "$g/rebase-apply/rebasing" ]; then
244 elif [ -f "$g/rebase-apply/applying" ]; then
249 elif [ -f "$g/MERGE_HEAD" ]; then
251 elif [ -f "$g/CHERRY_PICK_HEAD" ]; then
253 elif [ -f "$g/BISECT_LOG" ]; then
257 b="$(git symbolic-ref HEAD 2>/dev/null)" || {
260 case "${GIT_PS1_DESCRIBE_STYLE-}" in
262 git describe --contains HEAD ;;
264 git describe --contains --all HEAD ;;
268 git describe --tags --exact-match HEAD ;;
269 esac 2>/dev/null)" ||
271 b="$(cut -c1-7 "$g/HEAD" 2>/dev/null)..." ||
284 if [ "true" = "$(git rev-parse --is-inside-git-dir 2>/dev/null)" ]; then
285 if [ "true" = "$(git rev-parse --is-bare-repository 2>/dev/null)" ]; then
290 elif [ "true" = "$(git rev-parse --is-inside-work-tree 2>/dev/null)" ]; then
291 if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ]; then
292 if [ "$(git config --bool bash.showDirtyState)" != "false" ]; then
293 git diff --no-ext-diff --quiet --exit-code || w="*"
294 if git rev-parse --quiet --verify HEAD >/dev/null; then
295 git diff-index --cached --quiet HEAD -- || i="+"
301 if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ]; then
302 git rev-parse --verify refs/stash >/dev/null 2>&1 && s="$"
305 if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ]; then
306 if [ -n "$(git ls-files --others --exclude-standard)" ]; then
311 if [ -n "${GIT_PS1_SHOWUPSTREAM-}" ]; then
312 __git_ps1_show_upstream
317 printf "${1:- (%s)}" "$c${b##refs/heads/}${f:+ $f}$r$p"
321 # __gitcomp_1 requires 2 arguments
324 local c IFS=' '$'\t'$'\n'
327 --*=*) printf %s$'\n' "$c$2" ;;
328 *.) printf %s$'\n' "$c$2" ;;
329 *) printf %s$'\n' "$c$2 " ;;
334 # The following function is based on code from:
336 # bash_completion - programmable completion functions for bash 3.2+
338 # Copyright © 2006-2008, Ian Macdonald <ian@caliban.org>
339 # © 2009-2010, Bash Completion Maintainers
340 # <bash-completion-devel@lists.alioth.debian.org>
342 # This program is free software; you can redistribute it and/or modify
343 # it under the terms of the GNU General Public License as published by
344 # the Free Software Foundation; either version 2, or (at your option)
347 # This program is distributed in the hope that it will be useful,
348 # but WITHOUT ANY WARRANTY; without even the implied warranty of
349 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
350 # GNU General Public License for more details.
352 # You should have received a copy of the GNU General Public License
353 # along with this program; if not, write to the Free Software Foundation,
354 # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
356 # The latest version of this software can be obtained here:
358 # http://bash-completion.alioth.debian.org/
362 # This function can be used to access a tokenized list of words
363 # on the command line:
365 # __git_reassemble_comp_words_by_ref '=:'
366 # if test "${words_[cword_-1]}" = -w
371 # The argument should be a collection of characters from the list of
372 # word completion separators (COMP_WORDBREAKS) to treat as ordinary
375 # This is roughly equivalent to going back in time and setting
376 # COMP_WORDBREAKS to exclude those characters. The intent is to
377 # make option types like --date=<type> and <rev>:<path> easy to
378 # recognize by treating each shell word as a single token.
380 # It is best not to set COMP_WORDBREAKS directly because the value is
381 # shared with other completion scripts. By the time the completion
382 # function gets called, COMP_WORDS has already been populated so local
383 # changes to COMP_WORDBREAKS have no effect.
385 # Output: words_, cword_, cur_.
387 __git_reassemble_comp_words_by_ref()
389 local exclude i j first
390 # Which word separators to exclude?
391 exclude="${1//[^$COMP_WORDBREAKS]}"
393 if [ -z "$exclude" ]; then
394 words_=("${COMP_WORDS[@]}")
397 # List of word completion separators has shrunk;
398 # re-assemble words to complete.
399 for ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)); do
400 # Append each nonempty word consisting of just
401 # word separator characters to the current word.
405 [ -n "${COMP_WORDS[$i]}" ] &&
406 # word consists of excluded word separators
407 [ "${COMP_WORDS[$i]//[^$exclude]}" = "${COMP_WORDS[$i]}" ]
409 # Attach to the previous token,
410 # unless the previous token is the command name.
411 if [ $j -ge 2 ] && [ -n "$first" ]; then
415 words_[$j]=${words_[j]}${COMP_WORDS[i]}
416 if [ $i = $COMP_CWORD ]; then
419 if (($i < ${#COMP_WORDS[@]} - 1)); then
426 words_[$j]=${words_[j]}${COMP_WORDS[i]}
427 if [ $i = $COMP_CWORD ]; then
433 if ! type _get_comp_words_by_ref >/dev/null 2>&1; then
434 if [[ -z ${ZSH_VERSION:+set} ]]; then
435 _get_comp_words_by_ref ()
437 local exclude cur_ words_ cword_
438 if [ "$1" = "-n" ]; then
442 __git_reassemble_comp_words_by_ref "$exclude"
443 cur_=${words_[cword_]}
444 while [ $# -gt 0 ]; do
450 prev=${words_[$cword_-1]}
453 words=("${words_[@]}")
463 _get_comp_words_by_ref ()
465 while [ $# -gt 0 ]; do
468 cur=${COMP_WORDS[COMP_CWORD]}
471 prev=${COMP_WORDS[COMP_CWORD-1]}
474 words=("${COMP_WORDS[@]}")
480 # assume COMP_WORDBREAKS is already set sanely
490 # Generates completion reply with compgen, appending a space to possible
491 # completion words, if necessary.
492 # It accepts 1 to 4 arguments:
493 # 1: List of possible completion words.
494 # 2: A prefix to be added to each possible completion word (optional).
495 # 3: Generate possible completion matches for this word (optional).
496 # 4: A suffix to be appended to each possible completion word (optional).
499 local cur_="${3-$cur}"
507 COMPREPLY=($(compgen -P "${2-}" \
508 -W "$(__gitcomp_1 "${1-}" "${4-}")" \
514 # Generates completion reply with compgen from newline-separated possible
515 # completion words by appending a space to all of them.
516 # It accepts 1 to 4 arguments:
517 # 1: List of possible completion words, separated by a single newline.
518 # 2: A prefix to be added to each possible completion word (optional).
519 # 3: Generate possible completion matches for this word (optional).
520 # 4: A suffix to be appended to each possible completion word instead of
521 # the default space (optional). If specified but empty, nothing is
526 COMPREPLY=($(compgen -P "${2-}" -S "${4- }" -W "$1" -- "${3-$cur}"))
531 local dir="$(__gitdir)"
532 if [ -d "$dir" ]; then
533 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
541 local dir="$(__gitdir)"
542 if [ -d "$dir" ]; then
543 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
549 # __git_refs accepts 0, 1 (to pass to __gitdir), or 2 arguments
550 # presence of 2nd argument means use the guess heuristic employed
551 # by checkout for tracking branches
554 local i hash dir="$(__gitdir "${1-}")" track="${2-}"
556 if [ -d "$dir" ]; then
564 for i in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD; do
565 if [ -e "$dir/$i" ]; then echo $i; fi
567 format="refname:short"
568 refs="refs/tags refs/heads refs/remotes"
571 git --git-dir="$dir" for-each-ref --format="%($format)" \
573 if [ -n "$track" ]; then
574 # employ the heuristic used by git checkout
575 # Try to find a remote branch that matches the completion word
576 # but only output if the branch name is unique
578 git --git-dir="$dir" for-each-ref --shell --format="ref=%(refname:short)" \
580 while read -r entry; do
583 if [[ "$ref" == "$cur"* ]]; then
592 git ls-remote "$dir" "$cur*" 2>/dev/null | \
593 while read -r hash i; do
601 git ls-remote "$dir" HEAD ORIG_HEAD 'refs/tags/*' 'refs/heads/*' 'refs/remotes/*' 2>/dev/null | \
602 while read -r hash i; do
605 refs/*) echo "${i#refs/*/}" ;;
613 # __git_refs2 requires 1 argument (to pass to __git_refs)
617 for i in $(__git_refs "$1"); do
622 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
623 __git_refs_remotes ()
626 git ls-remote "$1" 'refs/heads/*' 2>/dev/null | \
627 while read -r hash i; do
628 echo "$i:refs/remotes/$1/${i#refs/heads/}"
634 local i IFS=$'\n' d="$(__gitdir)"
635 test -d "$d/remotes" && ls -1 "$d/remotes"
636 for i in $(git --git-dir="$d" config --get-regexp 'remote\..*\.url' 2>/dev/null); do
642 __git_list_merge_strategies ()
644 git merge -s help 2>&1 |
645 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
654 __git_merge_strategies=
655 # 'git merge -s help' (and thus detection of the merge strategy
656 # list) fails, unfortunately, if run outside of any git working
657 # tree. __git_merge_strategies is set to the empty string in
658 # that case, and the detection will be repeated the next time it
660 __git_compute_merge_strategies ()
662 test -n "$__git_merge_strategies" ||
663 __git_merge_strategies=$(__git_list_merge_strategies)
666 __git_complete_revlist_file ()
668 local pfx ls ref cur_="$cur"
688 case "$COMP_WORDBREAKS" in
690 *) pfx="$ref:$pfx" ;;
694 COMPREPLY=($(compgen -P "$pfx" \
695 -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
696 | sed '/^100... blob /{
712 pfx="${cur_%...*}..."
714 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
719 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
722 __gitcomp_nl "$(__git_refs)"
728 __git_complete_file ()
730 __git_complete_revlist_file
733 __git_complete_revlist ()
735 __git_complete_revlist_file
738 __git_complete_remote_or_refspec ()
740 local cur_="$cur" cmd="${words[1]}"
741 local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0
742 while [ $c -lt $cword ]; do
745 --mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
748 push) no_complete_refspec=1 ;;
757 *) remote="$i"; break ;;
761 if [ -z "$remote" ]; then
762 __gitcomp_nl "$(__git_remotes)"
765 if [ $no_complete_refspec = 1 ]; then
769 [ "$remote" = "." ] && remote=
772 case "$COMP_WORDBREAKS" in
774 *) pfx="${cur_%%:*}:" ;;
786 if [ $lhs = 1 ]; then
787 __gitcomp_nl "$(__git_refs2 "$remote")" "$pfx" "$cur_"
789 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
793 if [ $lhs = 1 ]; then
794 __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
796 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
800 if [ $lhs = 1 ]; then
801 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
803 __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
809 __git_complete_strategy ()
811 __git_compute_merge_strategies
814 __gitcomp "$__git_merge_strategies"
819 __gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}"
826 __git_list_all_commands ()
829 for i in $(git help -a|egrep '^ [a-zA-Z0-9]')
832 *--*) : helper pattern;;
839 __git_compute_all_commands ()
841 test -n "$__git_all_commands" ||
842 __git_all_commands=$(__git_list_all_commands)
845 __git_list_porcelain_commands ()
848 __git_compute_all_commands
849 for i in "help" $__git_all_commands
852 *--*) : helper pattern;;
853 applymbox) : ask gittus;;
854 applypatch) : ask gittus;;
855 archimport) : import;;
856 cat-file) : plumbing;;
857 check-attr) : plumbing;;
858 check-ref-format) : plumbing;;
859 checkout-index) : plumbing;;
860 commit-tree) : plumbing;;
861 count-objects) : infrequent;;
862 cvsexportcommit) : export;;
863 cvsimport) : import;;
864 cvsserver) : daemon;;
866 diff-files) : plumbing;;
867 diff-index) : plumbing;;
868 diff-tree) : plumbing;;
869 fast-import) : import;;
870 fast-export) : export;;
871 fsck-objects) : plumbing;;
872 fetch-pack) : plumbing;;
873 fmt-merge-msg) : plumbing;;
874 for-each-ref) : plumbing;;
875 hash-object) : plumbing;;
876 http-*) : transport;;
877 index-pack) : plumbing;;
878 init-db) : deprecated;;
879 local-fetch) : plumbing;;
880 lost-found) : infrequent;;
881 ls-files) : plumbing;;
882 ls-remote) : plumbing;;
883 ls-tree) : plumbing;;
884 mailinfo) : plumbing;;
885 mailsplit) : plumbing;;
886 merge-*) : plumbing;;
889 pack-objects) : plumbing;;
890 pack-redundant) : plumbing;;
891 pack-refs) : plumbing;;
892 parse-remote) : plumbing;;
893 patch-id) : plumbing;;
894 peek-remote) : plumbing;;
896 prune-packed) : plumbing;;
897 quiltimport) : import;;
898 read-tree) : plumbing;;
899 receive-pack) : plumbing;;
900 remote-*) : transport;;
901 repo-config) : deprecated;;
903 rev-list) : plumbing;;
904 rev-parse) : plumbing;;
905 runstatus) : plumbing;;
906 sh-setup) : internal;;
908 show-ref) : plumbing;;
909 send-pack) : plumbing;;
910 show-index) : plumbing;;
912 stripspace) : plumbing;;
913 symbolic-ref) : plumbing;;
914 tar-tree) : deprecated;;
915 unpack-file) : plumbing;;
916 unpack-objects) : plumbing;;
917 update-index) : plumbing;;
918 update-ref) : plumbing;;
919 update-server-info) : daemon;;
920 upload-archive) : plumbing;;
921 upload-pack) : plumbing;;
922 write-tree) : plumbing;;
924 verify-pack) : infrequent;;
925 verify-tag) : plumbing;;
931 __git_porcelain_commands=
932 __git_compute_porcelain_commands ()
934 __git_compute_all_commands
935 test -n "$__git_porcelain_commands" ||
936 __git_porcelain_commands=$(__git_list_porcelain_commands)
939 __git_pretty_aliases ()
942 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "pretty\..*" 2>/dev/null); do
955 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "alias\..*" 2>/dev/null); do
965 # __git_aliased_command requires 1 argument
966 __git_aliased_command ()
968 local word cmdline=$(git --git-dir="$(__gitdir)" \
969 config --get "alias.$1")
970 for word in $cmdline; do
976 \!*) : shell command alias ;;
978 *=*) : setting env ;;
987 # __git_find_on_cmdline requires 1 argument
988 __git_find_on_cmdline ()
990 local word subcommand c=1
991 while [ $c -lt $cword ]; do
993 for subcommand in $1; do
994 if [ "$subcommand" = "$word" ]; then
1003 __git_has_doubledash ()
1006 while [ $c -lt $cword ]; do
1007 if [ "--" = "${words[c]}" ]; then
1015 __git_whitespacelist="nowarn warn error error-all fix"
1019 local dir="$(__gitdir)"
1020 if [ -d "$dir"/rebase-apply ]; then
1021 __gitcomp "--skip --continue --resolved --abort"
1026 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1031 --3way --committer-date-is-author-date --ignore-date
1032 --ignore-whitespace --ignore-space-change
1033 --interactive --keep --no-utf8 --signoff --utf8
1034 --whitespace= --scissors
1045 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1050 --stat --numstat --summary --check --index
1051 --cached --index-info --reverse --reject --unidiff-zero
1052 --apply --no-add --exclude=
1053 --ignore-whitespace --ignore-space-change
1054 --whitespace= --inaccurate-eof --verbose
1063 __git_has_doubledash && return
1068 --interactive --refresh --patch --update --dry-run
1069 --ignore-errors --intent-to-add
1080 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
1084 __gitcomp_nl "$(__git_remotes)" "" "${cur##--remote=}"
1089 --format= --list --verbose
1090 --prefix= --remote= --exec=
1100 __git_has_doubledash && return
1102 local subcommands="start bad good skip reset visualize replay log run"
1103 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1104 if [ -z "$subcommand" ]; then
1105 if [ -f "$(__gitdir)"/BISECT_START ]; then
1106 __gitcomp "$subcommands"
1108 __gitcomp "replay start"
1113 case "$subcommand" in
1114 bad|good|reset|skip|start)
1115 __gitcomp_nl "$(__git_refs)"
1125 local i c=1 only_local_ref="n" has_r="n"
1127 while [ $c -lt $cword ]; do
1130 -d|-m) only_local_ref="y" ;;
1139 --color --no-color --verbose --abbrev= --no-abbrev
1140 --track --no-track --contains --merged --no-merged
1141 --set-upstream --edit-description
1145 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
1146 __gitcomp_nl "$(__git_heads)"
1148 __gitcomp_nl "$(__git_refs)"
1156 local cmd="${words[2]}"
1159 __gitcomp "create list-heads verify unbundle"
1162 # looking for a file
1167 __git_complete_revlist
1176 __git_has_doubledash && return
1180 __gitcomp "diff3 merge" "" "${cur##--conflict=}"
1184 --quiet --ours --theirs --track --no-track --merge
1185 --conflict= --orphan --patch
1189 # check if --track, --no-track, or --no-guess was specified
1190 # if so, disable DWIM mode
1191 local flags="--track --no-track --no-guess" track=1
1192 if [ -n "$(__git_find_on_cmdline "$flags")" ]; then
1195 __gitcomp_nl "$(__git_refs '' $track)"
1202 __gitcomp "$(__git_refs)"
1209 __gitcomp "--edit --no-commit"
1212 __gitcomp_nl "$(__git_refs)"
1219 __git_has_doubledash && return
1223 __gitcomp "--dry-run --quiet"
1256 __git_has_doubledash && return
1260 __gitcomp "default strip verbatim whitespace
1261 " "" "${cur##--cleanup=}"
1264 --reuse-message=*|--reedit-message=*|\
1265 --fixup=*|--squash=*)
1266 __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1269 --untracked-files=*)
1270 __gitcomp "all no normal" "" "${cur##--untracked-files=}"
1275 --all --author= --signoff --verify --no-verify
1276 --edit --amend --include --only --interactive
1277 --dry-run --reuse-message= --reedit-message=
1278 --reset-author --file= --message= --template=
1279 --cleanup= --untracked-files --untracked-files=
1280 --verbose --quiet --fixup= --squash=
1292 --all --tags --contains --abbrev= --candidates=
1293 --exact-match --debug --long --match --always
1297 __gitcomp_nl "$(__git_refs)"
1300 __git_diff_common_options="--stat --numstat --shortstat --summary
1301 --patch-with-stat --name-only --name-status --color
1302 --no-color --color-words --no-renames --check
1303 --full-index --binary --abbrev --diff-filter=
1304 --find-copies-harder
1305 --text --ignore-space-at-eol --ignore-space-change
1306 --ignore-all-space --exit-code --quiet --ext-diff
1308 --no-prefix --src-prefix= --dst-prefix=
1309 --inter-hunk-context=
1312 --dirstat --dirstat= --dirstat-by-file
1313 --dirstat-by-file= --cumulative
1318 __git_has_doubledash && return
1322 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1323 --base --ours --theirs --no-index
1324 $__git_diff_common_options
1329 __git_complete_revlist_file
1332 __git_mergetools_common="diffuse ecmerge emerge kdiff3 meld opendiff
1333 tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc3
1338 __git_has_doubledash && return
1342 __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
1346 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1347 --base --ours --theirs
1348 --no-renames --diff-filter= --find-copies-harder
1349 --relative --ignore-submodules
1357 __git_fetch_options="
1358 --quiet --verbose --append --upload-pack --force --keep --depth=
1359 --tags --no-tags --all --prune --dry-run
1366 __gitcomp "$__git_fetch_options"
1370 __git_complete_remote_or_refspec
1373 _git_format_patch ()
1379 " "" "${cur##--thread=}"
1384 --stdout --attach --no-attach --thread --thread=
1386 --numbered --start-number
1389 --signoff --signature --no-signature
1390 --in-reply-to= --cc=
1391 --full-index --binary
1394 --no-prefix --src-prefix= --dst-prefix=
1395 --inline --suffix= --ignore-if-in-upstream
1401 __git_complete_revlist
1409 --tags --root --unreachable --cache --no-reflogs --full
1410 --strict --verbose --lost-found
1422 __gitcomp "--prune --aggressive"
1434 __git_match_ctag() {
1435 awk "/^${1////\\/}/ { print \$1 }" "$2"
1440 __git_has_doubledash && return
1446 --text --ignore-case --word-regexp --invert-match
1447 --full-name --line-number
1448 --extended-regexp --basic-regexp --fixed-strings
1450 --files-with-matches --name-only
1451 --files-without-match
1454 --and --or --not --all-match
1460 case "$cword,$prev" in
1462 if test -r tags; then
1463 __gitcomp_nl "$(__git_match_ctag "$cur" tags)"
1469 __gitcomp_nl "$(__git_refs)"
1476 __gitcomp "--all --info --man --web"
1480 __git_compute_all_commands
1481 __gitcomp "$__git_all_commands $(__git_aliases)
1482 attributes cli core-tutorial cvs-migration
1483 diffcore gitk glossary hooks ignore modules
1484 namespaces repository-layout tutorial tutorial-2
1494 false true umask group all world everybody
1495 " "" "${cur##--shared=}"
1499 __gitcomp "--quiet --bare --template= --shared --shared="
1508 __git_has_doubledash && return
1512 __gitcomp "--cached --deleted --modified --others --ignored
1513 --stage --directory --no-empty-directory --unmerged
1514 --killed --exclude= --exclude-from=
1515 --exclude-per-directory= --exclude-standard
1516 --error-unmatch --with-tree= --full-name
1517 --abbrev --ignored --exclude-per-directory
1527 __gitcomp_nl "$(__git_remotes)"
1535 # Options that go well for log, shortlog and gitk
1536 __git_log_common_options="
1538 --branches --tags --remotes
1539 --first-parent --merges --no-merges
1541 --max-age= --since= --after=
1542 --min-age= --until= --before=
1543 --min-parents= --max-parents=
1544 --no-min-parents --no-max-parents
1546 # Options that go well for log and gitk (not shortlog)
1547 __git_log_gitk_options="
1548 --dense --sparse --full-history
1549 --simplify-merges --simplify-by-decoration
1550 --left-right --notes --no-notes
1552 # Options that go well for log and shortlog (not gitk)
1553 __git_log_shortlog_options="
1554 --author= --committer= --grep=
1558 __git_log_pretty_formats="oneline short medium full fuller email raw format:"
1559 __git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1563 __git_has_doubledash && return
1565 local g="$(git rev-parse --git-dir 2>/dev/null)"
1567 if [ -f "$g/MERGE_HEAD" ]; then
1571 --pretty=*|--format=*)
1572 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
1577 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1581 __gitcomp "long short" "" "${cur##--decorate=}"
1586 $__git_log_common_options
1587 $__git_log_shortlog_options
1588 $__git_log_gitk_options
1589 --root --topo-order --date-order --reverse
1590 --follow --full-diff
1591 --abbrev-commit --abbrev=
1592 --relative-date --date=
1593 --pretty= --format= --oneline
1596 --decorate --decorate=
1598 --parents --children
1600 $__git_diff_common_options
1601 --pickaxe-all --pickaxe-regex
1606 __git_complete_revlist
1609 __git_merge_options="
1610 --no-commit --no-stat --log --no-log --squash --strategy
1611 --commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit
1616 __git_complete_strategy && return
1620 __gitcomp "$__git_merge_options"
1623 __gitcomp_nl "$(__git_refs)"
1630 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1643 __gitcomp_nl "$(__git_refs)"
1650 __gitcomp "--dry-run"
1659 __gitcomp "--tags --all --stdin"
1664 local subcommands='add append copy edit list prune remove show'
1665 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1667 case "$subcommand,$cur" in
1672 case "${words[cword-1]}" in
1674 __gitcomp_nl "$(__git_refs)"
1677 __gitcomp "$subcommands --ref"
1681 add,--reuse-message=*|append,--reuse-message=*|\
1682 add,--reedit-message=*|append,--reedit-message=*)
1683 __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1686 __gitcomp '--file= --message= --reedit-message=
1693 __gitcomp '--dry-run --verbose'
1698 case "${words[cword-1]}" in
1702 __gitcomp_nl "$(__git_refs)"
1711 __git_complete_strategy && return
1716 --rebase --no-rebase
1717 $__git_merge_options
1718 $__git_fetch_options
1723 __git_complete_remote_or_refspec
1730 __gitcomp_nl "$(__git_remotes)"
1735 __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}"
1740 --all --mirror --tags --dry-run --force --verbose
1741 --receive-pack= --repo= --set-upstream
1746 __git_complete_remote_or_refspec
1751 local dir="$(__gitdir)"
1752 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1753 __gitcomp "--continue --skip --abort"
1756 __git_complete_strategy && return
1759 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1764 --onto --merge --strategy --interactive
1765 --preserve-merges --stat --no-stat
1766 --committer-date-is-author-date --ignore-date
1767 --ignore-whitespace --whitespace=
1773 __gitcomp_nl "$(__git_refs)"
1778 local subcommands="show delete expire"
1779 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1781 if [ -z "$subcommand" ]; then
1782 __gitcomp "$subcommands"
1784 __gitcomp_nl "$(__git_refs)"
1788 __git_send_email_confirm_options="always never auto cc compose"
1789 __git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
1796 $__git_send_email_confirm_options
1797 " "" "${cur##--confirm=}"
1802 $__git_send_email_suppresscc_options
1803 " "" "${cur##--suppress-cc=}"
1807 --smtp-encryption=*)
1808 __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1812 __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1813 --compose --confirm= --dry-run --envelope-sender
1815 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1816 --no-suppress-from --no-thread --quiet
1817 --signed-off-by-cc --smtp-pass --smtp-server
1818 --smtp-server-port --smtp-encryption= --smtp-user
1819 --subject --suppress-cc= --suppress-from --thread --to
1820 --validate --no-validate"
1832 __git_config_get_set_variables ()
1834 local prevword word config_file= c=$cword
1835 while [ $c -gt 1 ]; do
1838 --global|--system|--file=*)
1843 config_file="$word $prevword"
1851 git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null |
1866 __gitcomp_nl "$(__git_remotes)"
1870 __gitcomp_nl "$(__git_refs)"
1874 local remote="${prev#remote.}"
1875 remote="${remote%.fetch}"
1876 if [ -z "$cur" ]; then
1877 COMPREPLY=("refs/heads/")
1880 __gitcomp_nl "$(__git_refs_remotes "$remote")"
1884 local remote="${prev#remote.}"
1885 remote="${remote%.push}"
1886 __gitcomp_nl "$(git --git-dir="$(__gitdir)" \
1887 for-each-ref --format='%(refname):%(refname)' \
1891 pull.twohead|pull.octopus)
1892 __git_compute_merge_strategies
1893 __gitcomp "$__git_merge_strategies"
1896 color.branch|color.diff|color.interactive|\
1897 color.showbranch|color.status|color.ui)
1898 __gitcomp "always never auto"
1902 __gitcomp "false true"
1907 normal black red green yellow blue magenta cyan white
1908 bold dim ul blink reverse
1913 __gitcomp "man info web html"
1917 __gitcomp "$__git_log_date_formats"
1920 sendemail.aliasesfiletype)
1921 __gitcomp "mutt mailrc pine elm gnus"
1925 __gitcomp "$__git_send_email_confirm_options"
1928 sendemail.suppresscc)
1929 __gitcomp "$__git_send_email_suppresscc_options"
1932 --get|--get-all|--unset|--unset-all)
1933 __gitcomp_nl "$(__git_config_get_set_variables)"
1944 --global --system --file=
1945 --list --replace-all
1946 --get --get-all --get-regexp
1947 --add --unset --unset-all
1948 --remove-section --rename-section
1953 local pfx="${cur%.*}." cur_="${cur##*.}"
1954 __gitcomp "remote merge mergeoptions rebase" "$pfx" "$cur_"
1958 local pfx="${cur%.*}." cur_="${cur#*.}"
1959 __gitcomp_nl "$(__git_heads)" "$pfx" "$cur_" "."
1963 local pfx="${cur%.*}." cur_="${cur##*.}"
1965 argprompt cmd confirm needsfile noconsole norescan
1966 prompt revprompt revunmerged title
1971 local pfx="${cur%.*}." cur_="${cur##*.}"
1972 __gitcomp "cmd path" "$pfx" "$cur_"
1976 local pfx="${cur%.*}." cur_="${cur##*.}"
1977 __gitcomp "cmd path" "$pfx" "$cur_"
1981 local pfx="${cur%.*}." cur_="${cur##*.}"
1982 __gitcomp "cmd path trustExitCode" "$pfx" "$cur_"
1986 local pfx="${cur%.*}." cur_="${cur#*.}"
1987 __git_compute_all_commands
1988 __gitcomp_nl "$__git_all_commands" "$pfx" "$cur_"
1992 local pfx="${cur%.*}." cur_="${cur##*.}"
1994 url proxy fetch push mirror skipDefaultUpdate
1995 receivepack uploadpack tagopt pushurl
2000 local pfx="${cur%.*}." cur_="${cur#*.}"
2001 __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
2005 local pfx="${cur%.*}." cur_="${cur##*.}"
2006 __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_"
2012 advice.commitBeforeMerge
2014 advice.implicitIdentity
2015 advice.pushNonFastForward
2016 advice.resolveConflict
2020 apply.ignorewhitespace
2022 branch.autosetupmerge
2023 branch.autosetuprebase
2027 color.branch.current
2032 color.decorate.branch
2033 color.decorate.remoteBranch
2034 color.decorate.stash
2044 color.diff.whitespace
2049 color.grep.linenumber
2052 color.grep.separator
2054 color.interactive.error
2055 color.interactive.header
2056 color.interactive.help
2057 color.interactive.prompt
2062 color.status.changed
2064 color.status.nobranch
2065 color.status.untracked
2066 color.status.updated
2075 core.bigFileThreshold
2078 core.deltaBaseCacheLimit
2083 core.fsyncobjectfiles
2085 core.ignoreCygwinFSTricks
2088 core.logAllRefUpdates
2089 core.loosecompression
2092 core.packedGitWindowSize
2094 core.preferSymlinkRefs
2097 core.repositoryFormatVersion
2099 core.sharedRepository
2103 core.warnAmbiguousRefs
2106 diff.autorefreshindex
2108 diff.ignoreSubmodules
2113 diff.suppressBlankEmpty
2118 fetch.recurseSubmodules
2127 format.subjectprefix
2138 gc.reflogexpireunreachable
2142 gitcvs.commitmsgannotation
2143 gitcvs.dbTableNamePrefix
2154 gui.copyblamethreshold
2158 gui.matchtrackingbranch
2159 gui.newbranchtemplate
2160 gui.pruneduringfetch
2161 gui.spellingdictionary
2176 http.sslCertPasswordProtected
2181 i18n.logOutputEncoding
2187 imap.preformattedHTML
2197 interactive.singlekey
2213 mergetool.keepBackup
2214 mergetool.keepTemporaries
2219 notes.rewrite.rebase
2223 pack.deltaCacheLimit
2239 receive.denyCurrentBranch
2240 receive.denyDeleteCurrent
2242 receive.denyNonFastForwards
2245 receive.updateserverinfo
2247 repack.usedeltabaseoffset
2251 sendemail.aliasesfile
2252 sendemail.aliasfiletype
2256 sendemail.chainreplyto
2258 sendemail.envelopesender
2262 sendemail.signedoffbycc
2263 sendemail.smtpdomain
2264 sendemail.smtpencryption
2266 sendemail.smtpserver
2267 sendemail.smtpserveroption
2268 sendemail.smtpserverport
2270 sendemail.suppresscc
2271 sendemail.suppressfrom
2276 status.relativePaths
2277 status.showUntrackedFiles
2278 status.submodulesummary
2281 transfer.unpackLimit
2293 local subcommands="add rename rm show prune update set-head"
2294 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2295 if [ -z "$subcommand" ]; then
2296 __gitcomp "$subcommands"
2300 case "$subcommand" in
2301 rename|rm|show|prune)
2302 __gitcomp_nl "$(__git_remotes)"
2305 local i c='' IFS=$'\n'
2306 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "remotes\..*" 2>/dev/null); do
2320 __gitcomp_nl "$(__git_refs)"
2325 __git_has_doubledash && return
2329 __gitcomp "--merge --mixed --hard --soft --patch"
2333 __gitcomp_nl "$(__git_refs)"
2340 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
2344 __gitcomp_nl "$(__git_refs)"
2349 __git_has_doubledash && return
2353 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
2362 __git_has_doubledash && return
2367 $__git_log_common_options
2368 $__git_log_shortlog_options
2369 --numbered --summary
2374 __git_complete_revlist
2379 __git_has_doubledash && return
2382 --pretty=*|--format=*)
2383 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
2388 __gitcomp "--pretty= --format= --abbrev-commit --oneline
2389 $__git_diff_common_options
2402 --all --remotes --topo-order --current --more=
2403 --list --independent --merge-base --no-name
2405 --sha1-name --sparse --topics --reflog
2410 __git_complete_revlist
2415 local save_opts='--keep-index --no-keep-index --quiet --patch'
2416 local subcommands='save list show apply clear drop pop create branch'
2417 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2418 if [ -z "$subcommand" ]; then
2421 __gitcomp "$save_opts"
2424 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2425 __gitcomp "$subcommands"
2432 case "$subcommand,$cur" in
2434 __gitcomp "$save_opts"
2437 __gitcomp "--index --quiet"
2439 show,--*|drop,--*|branch,--*)
2442 show,*|apply,*|drop,*|pop,*|branch,*)
2443 __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
2444 | sed -n -e 's/:.*//p')"
2455 __git_has_doubledash && return
2457 local subcommands="add status init update summary foreach sync"
2458 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2461 __gitcomp "--quiet --cached"
2464 __gitcomp "$subcommands"
2474 init fetch clone rebase dcommit log find-rev
2475 set-tree commit-diff info create-ignore propget
2476 proplist show-ignore show-externals branch tag blame
2477 migrate mkdirs reset gc
2479 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2480 if [ -z "$subcommand" ]; then
2481 __gitcomp "$subcommands"
2483 local remote_opts="--username= --config-dir= --no-auth-cache"
2485 --follow-parent --authors-file= --repack=
2486 --no-metadata --use-svm-props --use-svnsync-props
2487 --log-window-size= --no-checkout --quiet
2488 --repack-flags --use-log-author --localtime
2489 --ignore-paths= $remote_opts
2492 --template= --shared= --trunk= --tags=
2493 --branches= --stdlayout --minimize-url
2494 --no-metadata --use-svm-props --use-svnsync-props
2495 --rewrite-root= --prefix= --use-log-author
2496 --add-author-from $remote_opts
2499 --edit --rmdir --find-copies-harder --copy-similarity=
2502 case "$subcommand,$cur" in
2504 __gitcomp "--revision= --fetch-all $fc_opts"
2507 __gitcomp "--revision= $fc_opts $init_opts"
2510 __gitcomp "$init_opts"
2514 --merge --strategy= --verbose --dry-run
2515 --fetch-all --no-rebase --commit-url
2516 --revision $cmt_opts $fc_opts
2520 __gitcomp "--stdin $cmt_opts $fc_opts"
2522 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
2523 show-externals,--*|mkdirs,--*)
2524 __gitcomp "--revision="
2528 --limit= --revision= --verbose --incremental
2529 --oneline --show-commit --non-recursive
2530 --authors-file= --color
2535 --merge --verbose --strategy= --local
2536 --fetch-all --dry-run $fc_opts
2540 __gitcomp "--message= --file= --revision= $cmt_opts"
2546 __gitcomp "--dry-run --message --tag"
2549 __gitcomp "--dry-run --message"
2552 __gitcomp "--git-format"
2556 --config-dir= --ignore-paths= --minimize
2557 --no-auth-cache --username=
2561 __gitcomp "--revision= --parent"
2573 while [ $c -lt $cword ]; do
2577 __gitcomp_nl "$(__git_tags)"
2593 __gitcomp_nl "$(__git_tags)"
2599 __gitcomp_nl "$(__git_refs)"
2611 local i c=1 command __git_dir
2613 if [[ -n ${ZSH_VERSION-} ]]; then
2617 # workaround zsh's bug that leaves 'words' as a special
2618 # variable in versions < 4.3.12
2621 # workaround zsh's bug that quotes spaces in the COMPREPLY
2622 # array if IFS doesn't contain spaces.
2626 local cur words cword prev
2627 _get_comp_words_by_ref -n =: cur words cword prev
2628 while [ $c -lt $cword ]; do
2631 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2632 --bare) __git_dir="." ;;
2633 --version|-p|--paginate) ;;
2634 --help) command="help"; break ;;
2635 *) command="$i"; break ;;
2640 if [ -z "$command" ]; then
2655 *) __git_compute_porcelain_commands
2656 __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
2661 local completion_func="_git_${command//-/_}"
2662 declare -f $completion_func >/dev/null && $completion_func && return
2664 local expansion=$(__git_aliased_command "$command")
2665 if [ -n "$expansion" ]; then
2666 completion_func="_git_${expansion//-/_}"
2667 declare -f $completion_func >/dev/null && $completion_func
2673 if [[ -n ${ZSH_VERSION-} ]]; then
2677 # workaround zsh's bug that leaves 'words' as a special
2678 # variable in versions < 4.3.12
2681 # workaround zsh's bug that quotes spaces in the COMPREPLY
2682 # array if IFS doesn't contain spaces.
2686 local cur words cword prev
2687 _get_comp_words_by_ref -n =: cur words cword prev
2689 __git_has_doubledash && return
2691 local g="$(__gitdir)"
2693 if [ -f "$g/MERGE_HEAD" ]; then
2699 $__git_log_common_options
2700 $__git_log_gitk_options
2706 __git_complete_revlist
2709 complete -o bashdefault -o default -o nospace -F _git git 2>/dev/null \
2710 || complete -o default -o nospace -F _git git
2711 complete -o bashdefault -o default -o nospace -F _gitk gitk 2>/dev/null \
2712 || complete -o default -o nospace -F _gitk gitk
2714 # The following are necessary only for Cygwin, and only are needed
2715 # when the user has tab-completed the executable name and consequently
2716 # included the '.exe' suffix.
2718 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
2719 complete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \
2720 || complete -o default -o nospace -F _git git.exe