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
64 if [[ -n ${ZSH_VERSION-} ]]; then
65 autoload
-U +X bashcompinit
&& bashcompinit
68 case "$COMP_WORDBREAKS" in
70 *) COMP_WORDBREAKS
="$COMP_WORDBREAKS:"
73 # __gitdir accepts 0 or 1 arguments (i.e., location)
74 # returns location of .git repo
77 if [ -z "${1-}" ]; then
78 if [ -n "${__git_dir-}" ]; then
80 elif [ -d .git
]; then
83 git rev-parse
--git-dir 2>/dev
/null
85 elif [ -d "$1/.git" ]; then
92 # stores the divergence from upstream in $p
93 # used by GIT_PS1_SHOWUPSTREAM
94 __git_ps1_show_upstream
()
97 local svn_remote svn_url_pattern count n
98 local upstream
=git legacy
="" verbose
=""
101 # get some config options from git-config
102 local output
="$(git config -z --get-regexp '^(svn-remote\..*\.url|bash\.showupstream)$' 2>/dev/null | tr '\0\n' '\n ')"
103 while read -r key value
; do
106 GIT_PS1_SHOWUPSTREAM
="$value"
107 if [[ -z "${GIT_PS1_SHOWUPSTREAM}" ]]; then
113 svn_remote
[ $
((${#svn_remote[@]} + 1)) ]="$value"
114 svn_url_pattern
+="\\|$value"
115 upstream
=svn
+git
# default upstream is SVN if available, else git
120 # parse configuration values
121 for option
in ${GIT_PS1_SHOWUPSTREAM}; do
123 git|svn
) upstream
="$option" ;;
124 verbose
) verbose
=1 ;;
131 git
) upstream
="@{upstream}" ;;
133 # get the upstream from the "git-svn-id: ..." in a commit message
134 # (git-svn uses essentially the same procedure internally)
135 local svn_upstream
=($
(git log
--first-parent -1 \
136 --grep="^git-svn-id: \(${svn_url_pattern#??}\)" 2>/dev
/null
))
137 if [[ 0 -ne ${#svn_upstream[@]} ]]; then
138 svn_upstream
=${svn_upstream[ ${#svn_upstream[@]} - 2 ]}
139 svn_upstream
=${svn_upstream%@*}
140 local n_stop
="${#svn_remote[@]}"
141 for ((n
=1; n
<= n_stop
; n
++)); do
142 svn_upstream
=${svn_upstream#${svn_remote[$n]}}
145 if [[ -z "$svn_upstream" ]]; then
146 # default branch name for checkouts with no layout:
147 upstream
=${GIT_SVN_ID:-git-svn}
149 upstream
=${svn_upstream#/}
151 elif [[ "svn+git" = "$upstream" ]]; then
152 upstream
="@{upstream}"
157 # Find how many commits we are ahead/behind our upstream
158 if [[ -z "$legacy" ]]; then
159 count
="$(git rev-list --count --left-right \
160 "$upstream"...HEAD 2>/dev/null)"
162 # produce equivalent output to --count for older versions of git
164 if commits
="$(git rev-list --left-right "$upstream"...HEAD 2>/dev/null)"
166 local commit behind
=0 ahead
=0
167 for commit
in $commits
170 "<"*) ((behind
++)) ;;
174 count
="$behind $ahead"
180 # calculate the result
181 if [[ -z "$verbose" ]]; then
185 "0 0") # equal to upstream
187 "0 "*) # ahead of upstream
189 *" 0") # behind upstream
191 *) # diverged from upstream
198 "0 0") # equal to upstream
200 "0 "*) # ahead of upstream
201 p
=" u+${count#0 }" ;;
202 *" 0") # behind upstream
203 p
=" u-${count% 0}" ;;
204 *) # diverged from upstream
205 p
=" u+${count#* }-${count% *}" ;;
212 # __git_ps1 accepts 0 or 1 arguments (i.e., format string)
213 # returns text to add to bash PS1 prompt (includes branch name)
216 local g
="$(__gitdir)"
220 if [ -f "$g/rebase-merge/interactive" ]; then
222 b
="$(cat "$g/rebase-merge
/head-name
")"
223 elif [ -d "$g/rebase-merge" ]; then
225 b
="$(cat "$g/rebase-merge
/head-name
")"
227 if [ -d "$g/rebase-apply" ]; then
228 if [ -f "$g/rebase-apply/rebasing" ]; then
230 elif [ -f "$g/rebase-apply/applying" ]; then
235 elif [ -f "$g/MERGE_HEAD" ]; then
237 elif [ -f "$g/CHERRY_PICK_HEAD" ]; then
239 elif [ -f "$g/BISECT_LOG" ]; then
243 b
="$(git symbolic-ref HEAD 2>/dev/null)" ||
{
246 case "${GIT_PS1_DESCRIBE_STYLE-}" in
248 git describe --contains HEAD ;;
250 git describe --contains --all HEAD ;;
254 git describe --tags --exact-match HEAD ;;
255 esac 2>/dev/null)" ||
257 b
="$(cut -c1-7 "$g/HEAD
" 2>/dev/null)..." ||
270 if [ "true" = "$(git rev-parse --is-inside-git-dir 2>/dev/null)" ]; then
271 if [ "true" = "$(git rev-parse --is-bare-repository 2>/dev/null)" ]; then
276 elif [ "true" = "$(git rev-parse --is-inside-work-tree 2>/dev/null)" ]; then
277 if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ]; then
278 if [ "$(git config --bool bash.showDirtyState)" != "false" ]; then
279 git
diff --no-ext-diff --quiet --exit-code || w
="*"
280 if git rev-parse
--quiet --verify HEAD
>/dev
/null
; then
281 git diff-index
--cached --quiet HEAD
-- || i
="+"
287 if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ]; then
288 git rev-parse
--verify refs
/stash
>/dev
/null
2>&1 && s
="$"
291 if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ]; then
292 if [ -n "$(git ls-files --others --exclude-standard)" ]; then
297 if [ -n "${GIT_PS1_SHOWUPSTREAM-}" ]; then
298 __git_ps1_show_upstream
303 printf -- "${1:- (%s)}" "$c${b##refs/heads/}${f:+ $f}$r$p"
307 # __gitcomp_1 requires 2 arguments
310 local c IFS
=' '$
'\t'$
'\n'
313 --*=*) printf %s$
'\n' "$c$2" ;;
314 *.
) printf %s$
'\n' "$c$2" ;;
315 *) printf %s$
'\n' "$c$2 " ;;
320 # The following function is based on code from:
322 # bash_completion - programmable completion functions for bash 3.2+
324 # Copyright © 2006-2008, Ian Macdonald <ian@caliban.org>
325 # © 2009-2010, Bash Completion Maintainers
326 # <bash-completion-devel@lists.alioth.debian.org>
328 # This program is free software; you can redistribute it and/or modify
329 # it under the terms of the GNU General Public License as published by
330 # the Free Software Foundation; either version 2, or (at your option)
333 # This program is distributed in the hope that it will be useful,
334 # but WITHOUT ANY WARRANTY; without even the implied warranty of
335 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
336 # GNU General Public License for more details.
338 # You should have received a copy of the GNU General Public License
339 # along with this program; if not, write to the Free Software Foundation,
340 # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
342 # The latest version of this software can be obtained here:
344 # http://bash-completion.alioth.debian.org/
348 # This function can be used to access a tokenized list of words
349 # on the command line:
351 # __git_reassemble_comp_words_by_ref '=:'
352 # if test "${words_[cword_-1]}" = -w
357 # The argument should be a collection of characters from the list of
358 # word completion separators (COMP_WORDBREAKS) to treat as ordinary
361 # This is roughly equivalent to going back in time and setting
362 # COMP_WORDBREAKS to exclude those characters. The intent is to
363 # make option types like --date=<type> and <rev>:<path> easy to
364 # recognize by treating each shell word as a single token.
366 # It is best not to set COMP_WORDBREAKS directly because the value is
367 # shared with other completion scripts. By the time the completion
368 # function gets called, COMP_WORDS has already been populated so local
369 # changes to COMP_WORDBREAKS have no effect.
371 # Output: words_, cword_, cur_.
373 __git_reassemble_comp_words_by_ref
()
375 local exclude i j first
376 # Which word separators to exclude?
377 exclude
="${1//[^$COMP_WORDBREAKS]}"
379 if [ -z "$exclude" ]; then
380 words_
=("${COMP_WORDS[@]}")
383 # List of word completion separators has shrunk;
384 # re-assemble words to complete.
385 for ((i
=0, j
=0; i
< ${#COMP_WORDS[@]}; i
++, j
++)); do
386 # Append each nonempty word consisting of just
387 # word separator characters to the current word.
391 [ -n "${COMP_WORDS[$i]}" ] &&
392 # word consists of excluded word separators
393 [ "${COMP_WORDS[$i]//[^$exclude]}" = "${COMP_WORDS[$i]}" ]
395 # Attach to the previous token,
396 # unless the previous token is the command name.
397 if [ $j -ge 2 ] && [ -n "$first" ]; then
401 words_
[$j]=${words_[j]}${COMP_WORDS[i]}
402 if [ $i = $COMP_CWORD ]; then
405 if (($i < ${#COMP_WORDS[@]} - 1)); then
412 words_
[$j]=${words_[j]}${COMP_WORDS[i]}
413 if [ $i = $COMP_CWORD ]; then
419 if ! type _get_comp_words_by_ref
>/dev
/null
2>&1; then
420 if [[ -z ${ZSH_VERSION:+set} ]]; then
421 _get_comp_words_by_ref
()
423 local exclude cur_ words_ cword_
424 if [ "$1" = "-n" ]; then
428 __git_reassemble_comp_words_by_ref
"$exclude"
429 cur_
=${words_[cword_]}
430 while [ $# -gt 0 ]; do
436 prev
=${words_[$cword_-1]}
439 words
=("${words_[@]}")
449 _get_comp_words_by_ref
()
451 while [ $# -gt 0 ]; do
454 cur
=${COMP_WORDS[COMP_CWORD]}
457 prev
=${COMP_WORDS[COMP_CWORD-1]}
460 words
=("${COMP_WORDS[@]}")
466 # assume COMP_WORDBREAKS is already set sanely
476 # Generates completion reply with compgen, appending a space to possible
477 # completion words, if necessary.
478 # It accepts 1 to 4 arguments:
479 # 1: List of possible completion words.
480 # 2: A prefix to be added to each possible completion word (optional).
481 # 3: Generate possible completion matches for this word (optional).
482 # 4: A suffix to be appended to each possible completion word (optional).
485 local cur_
="${3-$cur}"
493 COMPREPLY
=($
(compgen
-P "${2-}" \
494 -W "$(__gitcomp_1 "${1-}" "${4-}")" \
500 # Generates completion reply with compgen from newline-separated possible
501 # completion words by appending a space to all of them.
502 # It accepts 1 to 4 arguments:
503 # 1: List of possible completion words, separated by a single newline.
504 # 2: A prefix to be added to each possible completion word (optional).
505 # 3: Generate possible completion matches for this word (optional).
506 # 4: A suffix to be appended to each possible completion word instead of
507 # the default space (optional). If specified but empty, nothing is
513 # ZSH would quote the trailing space added with -S. bash users
514 # will appreciate the extra space to compensate the use of -o nospace.
515 if [ -n "${ZSH_VERSION-}" ] && [ "$suffix" = " " ]; then
519 COMPREPLY
=($
(compgen
-P "${2-}" -S "${4- }" -W "$1" -- "${3-$cur}"))
524 local dir
="$(__gitdir)"
525 if [ -d "$dir" ]; then
526 git
--git-dir="$dir" for-each-ref
--format='%(refname:short)' \
534 local dir
="$(__gitdir)"
535 if [ -d "$dir" ]; then
536 git
--git-dir="$dir" for-each-ref
--format='%(refname:short)' \
542 # __git_refs accepts 0, 1 (to pass to __gitdir), or 2 arguments
543 # presence of 2nd argument means use the guess heuristic employed
544 # by checkout for tracking branches
547 local i
hash dir
="$(__gitdir "${1-}")" track
="${2-}"
549 if [ -d "$dir" ]; then
557 for i
in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD
; do
558 if [ -e "$dir/$i" ]; then echo $i; fi
560 format
="refname:short"
561 refs
="refs/tags refs/heads refs/remotes"
564 git
--git-dir="$dir" for-each-ref
--format="%($format)" \
566 if [ -n "$track" ]; then
567 # employ the heuristic used by git checkout
568 # Try to find a remote branch that matches the completion word
569 # but only output if the branch name is unique
571 git
--git-dir="$dir" for-each-ref
--shell --format="ref=%(refname:short)" \
573 while read -r entry
; do
576 if [[ "$ref" == "$cur"* ]]; then
585 git ls-remote
"$dir" "$cur*" 2>/dev
/null | \
586 while read -r hash i
; do
594 git ls-remote
"$dir" HEAD ORIG_HEAD
'refs/tags/*' 'refs/heads/*' 'refs/remotes/*' 2>/dev
/null | \
595 while read -r hash i
; do
598 refs
/*) echo "${i#refs/*/}" ;;
606 # __git_refs2 requires 1 argument (to pass to __git_refs)
610 for i
in $
(__git_refs
"$1"); do
615 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
616 __git_refs_remotes
()
619 git ls-remote
"$1" 'refs/heads/*' 2>/dev
/null | \
620 while read -r hash i
; do
621 echo "$i:refs/remotes/$1/${i#refs/heads/}"
627 local i IFS
=$
'\n' d
="$(__gitdir)"
628 test -d "$d/remotes" && ls -1 "$d/remotes"
629 for i
in $
(git
--git-dir="$d" config
--get-regexp 'remote\..*\.url' 2>/dev
/null
); do
635 __git_list_merge_strategies
()
637 git merge
-s help 2>&1 |
638 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
647 __git_merge_strategies
=
648 # 'git merge -s help' (and thus detection of the merge strategy
649 # list) fails, unfortunately, if run outside of any git working
650 # tree. __git_merge_strategies is set to the empty string in
651 # that case, and the detection will be repeated the next time it
653 __git_compute_merge_strategies
()
655 test -n "$__git_merge_strategies" ||
656 __git_merge_strategies
=$
(__git_list_merge_strategies
)
659 __git_complete_revlist_file
()
661 local pfx
ls ref cur_
="$cur"
681 case "$COMP_WORDBREAKS" in
683 *) pfx
="$ref:$pfx" ;;
687 COMPREPLY
=($
(compgen
-P "$pfx" \
688 -W "$(git --git-dir="$
(__gitdir
)" ls-tree "$ls" \
689 | sed '/^100... blob /{
705 pfx
="${cur_%...*}..."
707 __gitcomp_nl
"$(__git_refs)" "$pfx" "$cur_"
712 __gitcomp_nl
"$(__git_refs)" "$pfx" "$cur_"
715 __gitcomp_nl
"$(__git_refs)"
721 __git_complete_file
()
723 __git_complete_revlist_file
726 __git_complete_revlist
()
728 __git_complete_revlist_file
731 __git_complete_remote_or_refspec
()
733 local cur_
="$cur" cmd
="${words[1]}"
734 local i c
=2 remote
="" pfx
="" lhs
=1 no_complete_refspec
=0
735 if [ "$cmd" = "remote" ]; then
738 while [ $c -lt $cword ]; do
741 --mirror) [ "$cmd" = "push" ] && no_complete_refspec
=1 ;;
744 push
) no_complete_refspec
=1 ;;
753 *) remote
="$i"; break ;;
757 if [ -z "$remote" ]; then
758 __gitcomp_nl
"$(__git_remotes)"
761 if [ $no_complete_refspec = 1 ]; then
765 [ "$remote" = "." ] && remote
=
768 case "$COMP_WORDBREAKS" in
770 *) pfx
="${cur_%%:*}:" ;;
782 if [ $lhs = 1 ]; then
783 __gitcomp_nl
"$(__git_refs2 "$remote")" "$pfx" "$cur_"
785 __gitcomp_nl
"$(__git_refs)" "$pfx" "$cur_"
789 if [ $lhs = 1 ]; then
790 __gitcomp_nl
"$(__git_refs "$remote")" "$pfx" "$cur_"
792 __gitcomp_nl
"$(__git_refs)" "$pfx" "$cur_"
796 if [ $lhs = 1 ]; then
797 __gitcomp_nl
"$(__git_refs)" "$pfx" "$cur_"
799 __gitcomp_nl
"$(__git_refs "$remote")" "$pfx" "$cur_"
805 __git_complete_strategy
()
807 __git_compute_merge_strategies
810 __gitcomp
"$__git_merge_strategies"
815 __gitcomp
"$__git_merge_strategies" "" "${cur##--strategy=}"
822 __git_list_all_commands
()
825 for i
in $
(git
help -a|
egrep '^ [a-zA-Z0-9]')
828 *--*) : helper pattern
;;
835 __git_compute_all_commands
()
837 test -n "$__git_all_commands" ||
838 __git_all_commands
=$
(__git_list_all_commands
)
841 __git_list_porcelain_commands
()
844 __git_compute_all_commands
845 for i
in "help" $__git_all_commands
848 *--*) : helper pattern
;;
849 applymbox
) : ask gittus
;;
850 applypatch
) : ask gittus
;;
851 archimport
) : import
;;
852 cat-file
) : plumbing
;;
853 check-attr
) : plumbing
;;
854 check-ref-format
) : plumbing
;;
855 checkout-index
) : plumbing
;;
856 commit-tree
) : plumbing
;;
857 count-objects
) : infrequent
;;
858 cvsexportcommit
) : export;;
859 cvsimport
) : import
;;
860 cvsserver
) : daemon
;;
862 diff-files
) : plumbing
;;
863 diff-index
) : plumbing
;;
864 diff-tree
) : plumbing
;;
865 fast-import
) : import
;;
866 fast-export
) : export;;
867 fsck-objects
) : plumbing
;;
868 fetch-pack
) : plumbing
;;
869 fmt-merge-msg
) : plumbing
;;
870 for-each-ref
) : plumbing
;;
871 hash-object
) : plumbing
;;
872 http-
*) : transport
;;
873 index-pack
) : plumbing
;;
874 init-db
) : deprecated
;;
875 local-fetch
) : plumbing
;;
876 lost-found
) : infrequent
;;
877 ls-files
) : plumbing
;;
878 ls-remote
) : plumbing
;;
879 ls-tree
) : plumbing
;;
880 mailinfo
) : plumbing
;;
881 mailsplit
) : plumbing
;;
882 merge-
*) : plumbing
;;
885 pack-objects
) : plumbing
;;
886 pack-redundant
) : plumbing
;;
887 pack-refs
) : plumbing
;;
888 parse-remote
) : plumbing
;;
889 patch-id
) : plumbing
;;
890 peek-remote
) : plumbing
;;
892 prune-packed
) : plumbing
;;
893 quiltimport
) : import
;;
894 read-tree
) : plumbing
;;
895 receive-pack
) : plumbing
;;
896 remote-
*) : transport
;;
897 repo-config
) : deprecated
;;
899 rev-list
) : plumbing
;;
900 rev-parse
) : plumbing
;;
901 runstatus
) : plumbing
;;
902 sh-setup
) : internal
;;
904 show-ref
) : plumbing
;;
905 send-pack
) : plumbing
;;
906 show-index
) : plumbing
;;
908 stripspace
) : plumbing
;;
909 symbolic-ref
) : plumbing
;;
910 tar-tree
) : deprecated
;;
911 unpack-file
) : plumbing
;;
912 unpack-objects
) : plumbing
;;
913 update-index
) : plumbing
;;
914 update-ref
) : plumbing
;;
915 update-server-info
) : daemon
;;
916 upload-archive
) : plumbing
;;
917 upload-pack
) : plumbing
;;
918 write-tree
) : plumbing
;;
920 verify-pack
) : infrequent
;;
921 verify-tag
) : plumbing
;;
927 __git_porcelain_commands
=
928 __git_compute_porcelain_commands
()
930 __git_compute_all_commands
931 test -n "$__git_porcelain_commands" ||
932 __git_porcelain_commands
=$
(__git_list_porcelain_commands
)
935 __git_pretty_aliases
()
938 for i
in $
(git
--git-dir="$(__gitdir)" config
--get-regexp "pretty\..*" 2>/dev
/null
); do
951 for i
in $
(git
--git-dir="$(__gitdir)" config
--get-regexp "alias\..*" 2>/dev
/null
); do
961 # __git_aliased_command requires 1 argument
962 __git_aliased_command
()
964 local word cmdline
=$
(git
--git-dir="$(__gitdir)" \
965 config
--get "alias.$1")
966 for word
in $cmdline; do
972 \
!*) : shell
command alias ;;
974 *=*) : setting env
;;
983 # __git_find_on_cmdline requires 1 argument
984 __git_find_on_cmdline
()
986 local word subcommand c
=1
987 while [ $c -lt $cword ]; do
989 for subcommand
in $1; do
990 if [ "$subcommand" = "$word" ]; then
999 __git_has_doubledash
()
1002 while [ $c -lt $cword ]; do
1003 if [ "--" = "${words[c]}" ]; then
1011 __git_whitespacelist
="nowarn warn error error-all fix"
1015 local dir
="$(__gitdir)"
1016 if [ -d "$dir"/rebase-apply
]; then
1017 __gitcomp
"--skip --continue --resolved --abort"
1022 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
1027 --3way --committer-date-is-author-date --ignore-date
1028 --ignore-whitespace --ignore-space-change
1029 --interactive --keep --no-utf8 --signoff --utf8
1030 --whitespace= --scissors
1041 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
1046 --stat --numstat --summary --check --index
1047 --cached --index-info --reverse --reject --unidiff-zero
1048 --apply --no-add --exclude=
1049 --ignore-whitespace --ignore-space-change
1050 --whitespace= --inaccurate-eof --verbose
1059 __git_has_doubledash
&& return
1064 --interactive --refresh --patch --update --dry-run
1065 --ignore-errors --intent-to-add
1076 __gitcomp
"$(git archive --list)" "" "${cur##--format=}"
1080 __gitcomp_nl
"$(__git_remotes)" "" "${cur##--remote=}"
1085 --format= --list --verbose
1086 --prefix= --remote= --exec=
1096 __git_has_doubledash
&& return
1098 local subcommands
="start bad good skip reset visualize replay log run"
1099 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1100 if [ -z "$subcommand" ]; then
1101 if [ -f "$(__gitdir)"/BISECT_START
]; then
1102 __gitcomp
"$subcommands"
1104 __gitcomp
"replay start"
1109 case "$subcommand" in
1110 bad|good|
reset|skip|start
)
1111 __gitcomp_nl
"$(__git_refs)"
1121 local i c
=1 only_local_ref
="n" has_r
="n"
1123 while [ $c -lt $cword ]; do
1126 -d|
-m) only_local_ref
="y" ;;
1135 --color --no-color --verbose --abbrev= --no-abbrev
1136 --track --no-track --contains --merged --no-merged
1137 --set-upstream --edit-description --list
1141 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
1142 __gitcomp_nl
"$(__git_heads)"
1144 __gitcomp_nl
"$(__git_refs)"
1152 local cmd
="${words[2]}"
1155 __gitcomp
"create list-heads verify unbundle"
1158 # looking for a file
1163 __git_complete_revlist
1172 __git_has_doubledash
&& return
1176 __gitcomp
"diff3 merge" "" "${cur##--conflict=}"
1180 --quiet --ours --theirs --track --no-track --merge
1181 --conflict= --orphan --patch
1185 # check if --track, --no-track, or --no-guess was specified
1186 # if so, disable DWIM mode
1187 local flags
="--track --no-track --no-guess" track
=1
1188 if [ -n "$(__git_find_on_cmdline "$flags")" ]; then
1191 __gitcomp_nl
"$(__git_refs '' $track)"
1198 __gitcomp
"$(__git_refs)"
1205 __gitcomp
"--edit --no-commit"
1208 __gitcomp_nl
"$(__git_refs)"
1215 __git_has_doubledash
&& return
1219 __gitcomp
"--dry-run --quiet"
1252 __git_has_doubledash
&& return
1256 __gitcomp
"default strip verbatim whitespace
1257 " "" "${cur##--cleanup=}"
1260 --reuse-message=*|
--reedit-message=*|\
1261 --fixup=*|
--squash=*)
1262 __gitcomp_nl
"$(__git_refs)" "" "${cur#*=}"
1265 --untracked-files=*)
1266 __gitcomp
"all no normal" "" "${cur##--untracked-files=}"
1271 --all --author= --signoff --verify --no-verify
1272 --edit --amend --include --only --interactive
1273 --dry-run --reuse-message= --reedit-message=
1274 --reset-author --file= --message= --template=
1275 --cleanup= --untracked-files --untracked-files=
1276 --verbose --quiet --fixup= --squash=
1288 --all --tags --contains --abbrev= --candidates=
1289 --exact-match --debug --long --match --always
1293 __gitcomp_nl
"$(__git_refs)"
1296 __git_diff_common_options
="--stat --numstat --shortstat --summary
1297 --patch-with-stat --name-only --name-status --color
1298 --no-color --color-words --no-renames --check
1299 --full-index --binary --abbrev --diff-filter=
1300 --find-copies-harder
1301 --text --ignore-space-at-eol --ignore-space-change
1302 --ignore-all-space --exit-code --quiet --ext-diff
1304 --no-prefix --src-prefix= --dst-prefix=
1305 --inter-hunk-context=
1308 --dirstat --dirstat= --dirstat-by-file
1309 --dirstat-by-file= --cumulative
1314 __git_has_doubledash
&& return
1318 __gitcomp
"--cached --staged --pickaxe-all --pickaxe-regex
1319 --base --ours --theirs --no-index
1320 $__git_diff_common_options
1325 __git_complete_revlist_file
1328 __git_mergetools_common
="diffuse ecmerge emerge kdiff3 meld opendiff
1329 tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc3
1334 __git_has_doubledash
&& return
1338 __gitcomp
"$__git_mergetools_common kompare" "" "${cur##--tool=}"
1342 __gitcomp
"--cached --staged --pickaxe-all --pickaxe-regex
1343 --base --ours --theirs
1344 --no-renames --diff-filter= --find-copies-harder
1345 --relative --ignore-submodules
1353 __git_fetch_options
="
1354 --quiet --verbose --append --upload-pack --force --keep --depth=
1355 --tags --no-tags --all --prune --dry-run
1362 __gitcomp
"$__git_fetch_options"
1366 __git_complete_remote_or_refspec
1369 _git_format_patch
()
1375 " "" "${cur##--thread=}"
1380 --stdout --attach --no-attach --thread --thread=
1382 --numbered --start-number
1385 --signoff --signature --no-signature
1386 --in-reply-to= --cc=
1387 --full-index --binary
1390 --no-prefix --src-prefix= --dst-prefix=
1391 --inline --suffix= --ignore-if-in-upstream
1397 __git_complete_revlist
1405 --tags --root --unreachable --cache --no-reflogs --full
1406 --strict --verbose --lost-found
1418 __gitcomp
"--prune --aggressive"
1430 __git_match_ctag
() {
1431 awk "/^${1////\\/}/ { print \$1 }" "$2"
1436 __git_has_doubledash
&& return
1442 --text --ignore-case --word-regexp --invert-match
1443 --full-name --line-number
1444 --extended-regexp --basic-regexp --fixed-strings
1446 --files-with-matches --name-only
1447 --files-without-match
1450 --and --or --not --all-match
1456 case "$cword,$prev" in
1458 if test -r tags
; then
1459 __gitcomp_nl
"$(__git_match_ctag "$cur" tags)"
1465 __gitcomp_nl
"$(__git_refs)"
1472 __gitcomp
"--all --info --man --web"
1476 __git_compute_all_commands
1477 __gitcomp
"$__git_all_commands $(__git_aliases)
1478 attributes cli core-tutorial cvs-migration
1479 diffcore gitk glossary hooks ignore modules
1480 namespaces repository-layout tutorial tutorial-2
1490 false true umask group all world everybody
1491 " "" "${cur##--shared=}"
1495 __gitcomp
"--quiet --bare --template= --shared --shared="
1504 __git_has_doubledash
&& return
1508 __gitcomp
"--cached --deleted --modified --others --ignored
1509 --stage --directory --no-empty-directory --unmerged
1510 --killed --exclude= --exclude-from=
1511 --exclude-per-directory= --exclude-standard
1512 --error-unmatch --with-tree= --full-name
1513 --abbrev --ignored --exclude-per-directory
1523 __gitcomp_nl
"$(__git_remotes)"
1531 # Options that go well for log, shortlog and gitk
1532 __git_log_common_options
="
1534 --branches --tags --remotes
1535 --first-parent --merges --no-merges
1537 --max-age= --since= --after=
1538 --min-age= --until= --before=
1539 --min-parents= --max-parents=
1540 --no-min-parents --no-max-parents
1542 # Options that go well for log and gitk (not shortlog)
1543 __git_log_gitk_options
="
1544 --dense --sparse --full-history
1545 --simplify-merges --simplify-by-decoration
1546 --left-right --notes --no-notes
1548 # Options that go well for log and shortlog (not gitk)
1549 __git_log_shortlog_options
="
1550 --author= --committer= --grep=
1554 __git_log_pretty_formats
="oneline short medium full fuller email raw format:"
1555 __git_log_date_formats
="relative iso8601 rfc2822 short local default raw"
1559 __git_has_doubledash
&& return
1561 local g
="$(git rev-parse --git-dir 2>/dev/null)"
1563 if [ -f "$g/MERGE_HEAD" ]; then
1567 --pretty=*|
--format=*)
1568 __gitcomp
"$__git_log_pretty_formats $(__git_pretty_aliases)
1573 __gitcomp
"$__git_log_date_formats" "" "${cur##--date=}"
1577 __gitcomp
"long short" "" "${cur##--decorate=}"
1582 $__git_log_common_options
1583 $__git_log_shortlog_options
1584 $__git_log_gitk_options
1585 --root --topo-order --date-order --reverse
1586 --follow --full-diff
1587 --abbrev-commit --abbrev=
1588 --relative-date --date=
1589 --pretty= --format= --oneline
1592 --decorate --decorate=
1594 --parents --children
1596 $__git_diff_common_options
1597 --pickaxe-all --pickaxe-regex
1602 __git_complete_revlist
1605 __git_merge_options
="
1606 --no-commit --no-stat --log --no-log --squash --strategy
1607 --commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit
1612 __git_complete_strategy
&& return
1616 __gitcomp
"$__git_merge_options"
1619 __gitcomp_nl
"$(__git_refs)"
1626 __gitcomp
"$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1639 __gitcomp_nl
"$(__git_refs)"
1646 __gitcomp
"--dry-run"
1655 __gitcomp
"--tags --all --stdin"
1660 local subcommands
='add append copy edit list prune remove show'
1661 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1663 case "$subcommand,$cur" in
1668 case "${words[cword-1]}" in
1670 __gitcomp_nl
"$(__git_refs)"
1673 __gitcomp
"$subcommands --ref"
1677 add
,--reuse-message=*|append
,--reuse-message=*|\
1678 add
,--reedit-message=*|append
,--reedit-message=*)
1679 __gitcomp_nl
"$(__git_refs)" "" "${cur#*=}"
1682 __gitcomp
'--file= --message= --reedit-message=
1689 __gitcomp
'--dry-run --verbose'
1694 case "${words[cword-1]}" in
1698 __gitcomp_nl
"$(__git_refs)"
1707 __git_complete_strategy
&& return
1712 --rebase --no-rebase
1713 $__git_merge_options
1714 $__git_fetch_options
1719 __git_complete_remote_or_refspec
1726 __gitcomp_nl
"$(__git_remotes)"
1731 __gitcomp_nl
"$(__git_remotes)" "" "${cur##--repo=}"
1736 --all --mirror --tags --dry-run --force --verbose
1737 --receive-pack= --repo= --set-upstream
1742 __git_complete_remote_or_refspec
1747 local dir
="$(__gitdir)"
1748 if [ -d "$dir"/rebase-apply
] ||
[ -d "$dir"/rebase-merge
]; then
1749 __gitcomp
"--continue --skip --abort"
1752 __git_complete_strategy
&& return
1755 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
1760 --onto --merge --strategy --interactive
1761 --preserve-merges --stat --no-stat
1762 --committer-date-is-author-date --ignore-date
1763 --ignore-whitespace --whitespace=
1769 __gitcomp_nl
"$(__git_refs)"
1774 local subcommands
="show delete expire"
1775 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1777 if [ -z "$subcommand" ]; then
1778 __gitcomp
"$subcommands"
1780 __gitcomp_nl
"$(__git_refs)"
1784 __git_send_email_confirm_options
="always never auto cc compose"
1785 __git_send_email_suppresscc_options
="author self cc bodycc sob cccmd body all"
1792 $__git_send_email_confirm_options
1793 " "" "${cur##--confirm=}"
1798 $__git_send_email_suppresscc_options
1799 " "" "${cur##--suppress-cc=}"
1803 --smtp-encryption=*)
1804 __gitcomp
"ssl tls" "" "${cur##--smtp-encryption=}"
1808 __gitcomp
"--annotate --bcc --cc --cc-cmd --chain-reply-to
1809 --compose --confirm= --dry-run --envelope-sender
1811 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1812 --no-suppress-from --no-thread --quiet
1813 --signed-off-by-cc --smtp-pass --smtp-server
1814 --smtp-server-port --smtp-encryption= --smtp-user
1815 --subject --suppress-cc= --suppress-from --thread --to
1816 --validate --no-validate"
1828 __git_config_get_set_variables
()
1830 local prevword word config_file
= c
=$cword
1831 while [ $c -gt 1 ]; do
1834 --global|
--system|
--file=*)
1839 config_file
="$word $prevword"
1847 git
--git-dir="$(__gitdir)" config
$config_file --list 2>/dev
/null |
1862 __gitcomp_nl
"$(__git_remotes)"
1866 __gitcomp_nl
"$(__git_refs)"
1870 local remote
="${prev#remote.}"
1871 remote
="${remote%.fetch}"
1872 if [ -z "$cur" ]; then
1873 COMPREPLY
=("refs/heads/")
1876 __gitcomp_nl
"$(__git_refs_remotes "$remote")"
1880 local remote
="${prev#remote.}"
1881 remote
="${remote%.push}"
1882 __gitcomp_nl
"$(git --git-dir="$
(__gitdir
)" \
1883 for-each-ref --format='%(refname):%(refname)' \
1887 pull.twohead|pull.octopus
)
1888 __git_compute_merge_strategies
1889 __gitcomp
"$__git_merge_strategies"
1892 color.branch|color.
diff|color.interactive|\
1893 color.showbranch|color.status|color.ui
)
1894 __gitcomp
"always never auto"
1898 __gitcomp
"false true"
1903 normal black red green yellow blue magenta cyan white
1904 bold dim ul blink reverse
1909 __gitcomp
"man info web html"
1913 __gitcomp
"$__git_log_date_formats"
1916 sendemail.aliasesfiletype
)
1917 __gitcomp
"mutt mailrc pine elm gnus"
1921 __gitcomp
"$__git_send_email_confirm_options"
1924 sendemail.suppresscc
)
1925 __gitcomp
"$__git_send_email_suppresscc_options"
1928 --get|
--get-all|
--unset|
--unset-all)
1929 __gitcomp_nl
"$(__git_config_get_set_variables)"
1940 --global --system --file=
1941 --list --replace-all
1942 --get --get-all --get-regexp
1943 --add --unset --unset-all
1944 --remove-section --rename-section
1949 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1950 __gitcomp
"remote merge mergeoptions rebase" "$pfx" "$cur_"
1954 local pfx
="${cur%.*}." cur_
="${cur#*.}"
1955 __gitcomp_nl
"$(__git_heads)" "$pfx" "$cur_" "."
1959 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1961 argprompt cmd confirm needsfile noconsole norescan
1962 prompt revprompt revunmerged title
1967 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1968 __gitcomp
"cmd path" "$pfx" "$cur_"
1972 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1973 __gitcomp
"cmd path" "$pfx" "$cur_"
1977 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1978 __gitcomp
"cmd path trustExitCode" "$pfx" "$cur_"
1982 local pfx
="${cur%.*}." cur_
="${cur#*.}"
1983 __git_compute_all_commands
1984 __gitcomp_nl
"$__git_all_commands" "$pfx" "$cur_"
1988 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1990 url proxy fetch push mirror skipDefaultUpdate
1991 receivepack uploadpack tagopt pushurl
1996 local pfx
="${cur%.*}." cur_
="${cur#*.}"
1997 __gitcomp_nl
"$(__git_remotes)" "$pfx" "$cur_" "."
2001 local pfx
="${cur%.*}." cur_
="${cur##*.}"
2002 __gitcomp
"insteadOf pushInsteadOf" "$pfx" "$cur_"
2008 advice.commitBeforeMerge
2010 advice.implicitIdentity
2011 advice.pushNonFastForward
2012 advice.resolveConflict
2016 apply.ignorewhitespace
2018 branch.autosetupmerge
2019 branch.autosetuprebase
2023 color.branch.current
2028 color.decorate.branch
2029 color.decorate.remoteBranch
2030 color.decorate.stash
2040 color.diff.whitespace
2045 color.grep.linenumber
2048 color.grep.separator
2050 color.interactive.error
2051 color.interactive.header
2052 color.interactive.help
2053 color.interactive.prompt
2058 color.status.changed
2060 color.status.nobranch
2061 color.status.untracked
2062 color.status.updated
2071 core.bigFileThreshold
2074 core.deltaBaseCacheLimit
2079 core.fsyncobjectfiles
2081 core.ignoreCygwinFSTricks
2084 core.logAllRefUpdates
2085 core.loosecompression
2088 core.packedGitWindowSize
2090 core.preferSymlinkRefs
2093 core.repositoryFormatVersion
2095 core.sharedRepository
2099 core.warnAmbiguousRefs
2102 diff.autorefreshindex
2105 diff.ignoreSubmodules
2110 diff.suppressBlankEmpty
2115 fetch.recurseSubmodules
2124 format.subjectprefix
2135 gc.reflogexpireunreachable
2139 gitcvs.commitmsgannotation
2140 gitcvs.dbTableNamePrefix
2151 gui.copyblamethreshold
2155 gui.matchtrackingbranch
2156 gui.newbranchtemplate
2157 gui.pruneduringfetch
2158 gui.spellingdictionary
2173 http.sslCertPasswordProtected
2178 i18n.logOutputEncoding
2184 imap.preformattedHTML
2194 interactive.singlekey
2210 mergetool.keepBackup
2211 mergetool.keepTemporaries
2216 notes.rewrite.rebase
2220 pack.deltaCacheLimit
2236 receive.denyCurrentBranch
2237 receive.denyDeleteCurrent
2239 receive.denyNonFastForwards
2242 receive.updateserverinfo
2244 repack.usedeltabaseoffset
2248 sendemail.aliasesfile
2249 sendemail.aliasfiletype
2253 sendemail.chainreplyto
2255 sendemail.envelopesender
2259 sendemail.signedoffbycc
2260 sendemail.smtpdomain
2261 sendemail.smtpencryption
2263 sendemail.smtpserver
2264 sendemail.smtpserveroption
2265 sendemail.smtpserverport
2267 sendemail.suppresscc
2268 sendemail.suppressfrom
2273 status.relativePaths
2274 status.showUntrackedFiles
2275 status.submodulesummary
2278 transfer.unpackLimit
2290 local subcommands
="add rename rm set-head set-branches set-url show prune update"
2291 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
2292 if [ -z "$subcommand" ]; then
2293 __gitcomp
"$subcommands"
2297 case "$subcommand" in
2298 rename|
rm|set-url|show|prune
)
2299 __gitcomp_nl
"$(__git_remotes)"
2301 set-head|set-branches
)
2302 __git_complete_remote_or_refspec
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 --interactive $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