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
=""
112 # get some config options from git-config
113 while read key value
; do
116 GIT_PS1_SHOWUPSTREAM
="$value"
117 if [[ -z "${GIT_PS1_SHOWUPSTREAM}" ]]; then
123 svn_remote
[ $
((${#svn_remote[@]} + 1)) ]="$value"
124 svn_url_pattern
+="\\|$value"
125 upstream
=svn
+git
# default upstream is SVN if available, else git
128 done < <(git config
-z --get-regexp '^(svn-remote\..*\.url|bash\.showupstream)$' 2>/dev
/null |
tr '\0\n' '\n ')
130 # parse configuration values
131 for option
in ${GIT_PS1_SHOWUPSTREAM}; do
133 git|svn
) upstream
="$option" ;;
134 verbose
) verbose
=1 ;;
141 git
) upstream
="@{upstream}" ;;
143 # get the upstream from the "git-svn-id: ..." in a commit message
144 # (git-svn uses essentially the same procedure internally)
145 local svn_upstream
=($
(git log
--first-parent -1 \
146 --grep="^git-svn-id: \(${svn_url_pattern#??}\)" 2>/dev
/null
))
147 if [[ 0 -ne ${#svn_upstream[@]} ]]; then
148 svn_upstream
=${svn_upstream[ ${#svn_upstream[@]} - 2 ]}
149 svn_upstream
=${svn_upstream%@*}
150 local n_stop
="${#svn_remote[@]}"
151 for ((n
=1; n
<= n_stop
; ++n
)); do
152 svn_upstream
=${svn_upstream#${svn_remote[$n]}}
155 if [[ -z "$svn_upstream" ]]; then
156 # default branch name for checkouts with no layout:
157 upstream
=${GIT_SVN_ID:-git-svn}
159 upstream
=${svn_upstream#/}
161 elif [[ "svn+git" = "$upstream" ]]; then
162 upstream
="@{upstream}"
167 # Find how many commits we are ahead/behind our upstream
168 if [[ -z "$legacy" ]]; then
169 count
="$(git rev-list --count --left-right \
170 "$upstream"...HEAD 2>/dev/null)"
172 # produce equivalent output to --count for older versions of git
174 if commits
="$(git rev-list --left-right "$upstream"...HEAD 2>/dev/null)"
176 local commit behind
=0 ahead
=0
177 for commit
in $commits
186 count
="$behind $ahead"
192 # calculate the result
193 if [[ -z "$verbose" ]]; then
197 "0 0") # equal to upstream
199 "0 "*) # ahead of upstream
201 *" 0") # behind upstream
203 *) # diverged from upstream
210 "0 0") # equal to upstream
212 "0 "*) # ahead of upstream
213 p
=" u+${count#0 }" ;;
214 *" 0") # behind upstream
215 p
=" u-${count% 0}" ;;
216 *) # diverged from upstream
217 p
=" u+${count#* }-${count% *}" ;;
224 # __git_ps1 accepts 0 or 1 arguments (i.e., format string)
225 # returns text to add to bash PS1 prompt (includes branch name)
228 local g
="$(__gitdir)"
232 if [ -f "$g/rebase-merge/interactive" ]; then
234 b
="$(cat "$g/rebase-merge
/head-name
")"
235 elif [ -d "$g/rebase-merge" ]; then
237 b
="$(cat "$g/rebase-merge
/head-name
")"
239 if [ -d "$g/rebase-apply" ]; then
240 if [ -f "$g/rebase-apply/rebasing" ]; then
242 elif [ -f "$g/rebase-apply/applying" ]; then
247 elif [ -f "$g/MERGE_HEAD" ]; then
249 elif [ -f "$g/CHERRY_PICK_HEAD" ]; then
251 elif [ -f "$g/BISECT_LOG" ]; then
255 b
="$(git symbolic-ref HEAD 2>/dev/null)" ||
{
258 case "${GIT_PS1_DESCRIBE_STYLE-}" in
260 git describe --contains HEAD ;;
262 git describe --contains --all HEAD ;;
266 git describe --tags --exact-match HEAD ;;
267 esac 2>/dev/null)" ||
269 b
="$(cut -c1-7 "$g/HEAD
" 2>/dev/null)..." ||
282 if [ "true" = "$(git rev-parse --is-inside-git-dir 2>/dev/null)" ]; then
283 if [ "true" = "$(git rev-parse --is-bare-repository 2>/dev/null)" ]; then
288 elif [ "true" = "$(git rev-parse --is-inside-work-tree 2>/dev/null)" ]; then
289 if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ]; then
290 if [ "$(git config --bool bash.showDirtyState)" != "false" ]; then
291 git
diff --no-ext-diff --quiet --exit-code || w
="*"
292 if git rev-parse
--quiet --verify HEAD
>/dev
/null
; then
293 git diff-index
--cached --quiet HEAD
-- || i
="+"
299 if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ]; then
300 git rev-parse
--verify refs
/stash
>/dev
/null
2>&1 && s
="$"
303 if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ]; then
304 if [ -n "$(git ls-files --others --exclude-standard)" ]; then
309 if [ -n "${GIT_PS1_SHOWUPSTREAM-}" ]; then
310 __git_ps1_show_upstream
315 printf "${1:- (%s)}" "$c${b##refs/heads/}${f:+ $f}$r$p"
319 # __gitcomp_1 requires 2 arguments
322 local c IFS
=' '$
'\t'$
'\n'
325 --*=*) printf %s$
'\n' "$c$2" ;;
326 *.
) printf %s$
'\n' "$c$2" ;;
327 *) printf %s$
'\n' "$c$2 " ;;
332 # The following function is based on code from:
334 # bash_completion - programmable completion functions for bash 3.2+
336 # Copyright © 2006-2008, Ian Macdonald <ian@caliban.org>
337 # © 2009-2010, Bash Completion Maintainers
338 # <bash-completion-devel@lists.alioth.debian.org>
340 # This program is free software; you can redistribute it and/or modify
341 # it under the terms of the GNU General Public License as published by
342 # the Free Software Foundation; either version 2, or (at your option)
345 # This program is distributed in the hope that it will be useful,
346 # but WITHOUT ANY WARRANTY; without even the implied warranty of
347 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
348 # GNU General Public License for more details.
350 # You should have received a copy of the GNU General Public License
351 # along with this program; if not, write to the Free Software Foundation,
352 # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
354 # The latest version of this software can be obtained here:
356 # http://bash-completion.alioth.debian.org/
360 # This function can be used to access a tokenized list of words
361 # on the command line:
363 # __git_reassemble_comp_words_by_ref '=:'
364 # if test "${words_[cword_-1]}" = -w
369 # The argument should be a collection of characters from the list of
370 # word completion separators (COMP_WORDBREAKS) to treat as ordinary
373 # This is roughly equivalent to going back in time and setting
374 # COMP_WORDBREAKS to exclude those characters. The intent is to
375 # make option types like --date=<type> and <rev>:<path> easy to
376 # recognize by treating each shell word as a single token.
378 # It is best not to set COMP_WORDBREAKS directly because the value is
379 # shared with other completion scripts. By the time the completion
380 # function gets called, COMP_WORDS has already been populated so local
381 # changes to COMP_WORDBREAKS have no effect.
383 # Output: words_, cword_, cur_.
385 __git_reassemble_comp_words_by_ref
()
387 local exclude i j first
388 # Which word separators to exclude?
389 exclude
="${1//[^$COMP_WORDBREAKS]}"
391 if [ -z "$exclude" ]; then
392 words_
=("${COMP_WORDS[@]}")
395 # List of word completion separators has shrunk;
396 # re-assemble words to complete.
397 for ((i
=0, j
=0; i
< ${#COMP_WORDS[@]}; i
++, j
++)); do
398 # Append each nonempty word consisting of just
399 # word separator characters to the current word.
403 [ -n "${COMP_WORDS[$i]}" ] &&
404 # word consists of excluded word separators
405 [ "${COMP_WORDS[$i]//[^$exclude]}" = "${COMP_WORDS[$i]}" ]
407 # Attach to the previous token,
408 # unless the previous token is the command name.
409 if [ $j -ge 2 ] && [ -n "$first" ]; then
413 words_
[$j]=${words_[j]}${COMP_WORDS[i]}
414 if [ $i = $COMP_CWORD ]; then
417 if (($i < ${#COMP_WORDS[@]} - 1)); then
424 words_
[$j]=${words_[j]}${COMP_WORDS[i]}
425 if [ $i = $COMP_CWORD ]; then
431 if ! type _get_comp_words_by_ref
>/dev
/null
2>&1; then
432 if [[ -z ${ZSH_VERSION:+set} ]]; then
433 _get_comp_words_by_ref
()
435 local exclude cur_ words_ cword_
436 if [ "$1" = "-n" ]; then
440 __git_reassemble_comp_words_by_ref
"$exclude"
441 cur_
=${words_[cword_]}
442 while [ $# -gt 0 ]; do
448 prev
=${words_[$cword_-1]}
451 words
=("${words_[@]}")
461 _get_comp_words_by_ref
()
463 while [ $# -gt 0 ]; do
466 cur
=${COMP_WORDS[COMP_CWORD]}
469 prev
=${COMP_WORDS[COMP_CWORD-1]}
472 words
=("${COMP_WORDS[@]}")
478 # assume COMP_WORDBREAKS is already set sanely
488 # Generates completion reply with compgen, appending a space to possible
489 # completion words, if necessary.
490 # It accepts 1 to 4 arguments:
491 # 1: List of possible completion words.
492 # 2: A prefix to be added to each possible completion word (optional).
493 # 3: Generate possible completion matches for this word (optional).
494 # 4: A suffix to be appended to each possible completion word (optional).
499 if [ $# -gt 2 ]; then
508 COMPREPLY
=($
(compgen
-P "${2-}" \
509 -W "$(__gitcomp_1 "${1-}" "${4-}")" \
515 # Generates completion reply with compgen from newline-separated possible
516 # completion words by appending a space to all of them.
517 # It accepts 1 to 4 arguments:
518 # 1: List of possible completion words, separated by a single newline.
519 # 2: A prefix to be added to each possible completion word (optional).
520 # 3: Generate possible completion matches for this word (optional).
521 # 4: A suffix to be appended to each possible completion word instead of
522 # the default space (optional). If specified but empty, nothing is
526 local s
=$
'\n' IFS
=' '$
'\t'$
'\n'
527 local cur_
="$cur" suffix
=" "
529 if [ $# -gt 2 ]; then
531 if [ $# -gt 3 ]; then
537 COMPREPLY
=($
(compgen
-P "${2-}" -S "$suffix" -W "$1" -- "$cur_"))
540 # __git_heads accepts 0 or 1 arguments (to pass to __gitdir)
543 local cmd i is_hash
=y dir
="$(__gitdir "${1-}")"
544 if [ -d "$dir" ]; then
545 git
--git-dir="$dir" for-each-ref
--format='%(refname:short)' \
549 for i
in $
(git ls-remote
"${1-}" 2>/dev
/null
); do
550 case "$is_hash,$i" in
553 n
,refs
/heads
/*) is_hash
=y
; echo "${i#refs/heads/}" ;;
554 n
,*) is_hash
=y
; echo "$i" ;;
559 # __git_tags accepts 0 or 1 arguments (to pass to __gitdir)
562 local cmd i is_hash
=y dir
="$(__gitdir "${1-}")"
563 if [ -d "$dir" ]; then
564 git
--git-dir="$dir" for-each-ref
--format='%(refname:short)' \
568 for i
in $
(git ls-remote
"${1-}" 2>/dev
/null
); do
569 case "$is_hash,$i" in
572 n
,refs
/tags
/*) is_hash
=y
; echo "${i#refs/tags/}" ;;
573 n
,*) is_hash
=y
; echo "$i" ;;
578 # __git_refs accepts 0, 1 (to pass to __gitdir), or 2 arguments
579 # presence of 2nd argument means use the guess heuristic employed
580 # by checkout for tracking branches
583 local i
hash dir
="$(__gitdir "${1-}")" track
="${2-}"
585 if [ -d "$dir" ]; then
593 for i
in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD
; do
594 if [ -e "$dir/$i" ]; then echo $i; fi
596 format
="refname:short"
597 refs
="refs/tags refs/heads refs/remotes"
600 git
--git-dir="$dir" for-each-ref
--format="%($format)" \
602 if [ -n "$track" ]; then
603 # employ the heuristic used by git checkout
604 # Try to find a remote branch that matches the completion word
605 # but only output if the branch name is unique
607 git
--git-dir="$dir" for-each-ref
--shell --format="ref=%(refname:short)" \
612 if [[ "$ref" == "$cur"* ]]; then
621 git ls-remote
"$dir" "$cur*" 2>/dev
/null | \
622 while read hash i
; do
630 git ls-remote
"$dir" HEAD ORIG_HEAD
'refs/tags/*' 'refs/heads/*' 'refs/remotes/*' 2>/dev
/null | \
631 while read hash i
; do
634 refs
/*) echo "${i#refs/*/}" ;;
642 # __git_refs2 requires 1 argument (to pass to __git_refs)
646 for i
in $
(__git_refs
"$1"); do
651 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
652 __git_refs_remotes
()
654 local cmd i is_hash
=y
655 for i
in $
(git ls-remote
"$1" 2>/dev
/null
); do
656 case "$is_hash,$i" in
659 echo "$i:refs/remotes/$1/${i#refs/heads/}"
663 n
,refs
/tags
/*) is_hash
=y
;;
671 local i ngoff IFS
=$
'\n' d
="$(__gitdir)"
672 __git_shopt
-q nullglob || ngoff
=1
673 __git_shopt
-s nullglob
674 for i
in "$d/remotes"/*; do
675 echo ${i#$d/remotes/}
677 [ "$ngoff" ] && __git_shopt
-u nullglob
678 for i
in $
(git
--git-dir="$d" config
--get-regexp 'remote\..*\.url' 2>/dev
/null
); do
684 __git_list_merge_strategies
()
686 git merge
-s help 2>&1 |
687 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
696 __git_merge_strategies
=
697 # 'git merge -s help' (and thus detection of the merge strategy
698 # list) fails, unfortunately, if run outside of any git working
699 # tree. __git_merge_strategies is set to the empty string in
700 # that case, and the detection will be repeated the next time it
702 __git_compute_merge_strategies
()
704 : ${__git_merge_strategies:=$(__git_list_merge_strategies)}
707 __git_complete_revlist_file
()
709 local pfx
ls ref cur_
="$cur"
729 case "$COMP_WORDBREAKS" in
731 *) pfx
="$ref:$pfx" ;;
735 COMPREPLY
=($
(compgen
-P "$pfx" \
736 -W "$(git --git-dir="$
(__gitdir
)" ls-tree "$ls" \
737 | sed '/^100... blob /{
753 pfx
="${cur_%...*}..."
755 __gitcomp_nl
"$(__git_refs)" "$pfx" "$cur_"
760 __gitcomp_nl
"$(__git_refs)" "$pfx" "$cur_"
763 __gitcomp_nl
"$(__git_refs)"
769 __git_complete_file
()
771 __git_complete_revlist_file
774 __git_complete_revlist
()
776 __git_complete_revlist_file
779 __git_complete_remote_or_refspec
()
781 local cur_
="$cur" cmd
="${words[1]}"
782 local i c
=2 remote
="" pfx
="" lhs
=1 no_complete_refspec
=0
783 while [ $c -lt $cword ]; do
786 --mirror) [ "$cmd" = "push" ] && no_complete_refspec
=1 ;;
789 push
) no_complete_refspec
=1 ;;
798 *) remote
="$i"; break ;;
802 if [ -z "$remote" ]; then
803 __gitcomp_nl
"$(__git_remotes)"
806 if [ $no_complete_refspec = 1 ]; then
810 [ "$remote" = "." ] && remote
=
813 case "$COMP_WORDBREAKS" in
815 *) pfx
="${cur_%%:*}:" ;;
827 if [ $lhs = 1 ]; then
828 __gitcomp_nl
"$(__git_refs2 "$remote")" "$pfx" "$cur_"
830 __gitcomp_nl
"$(__git_refs)" "$pfx" "$cur_"
834 if [ $lhs = 1 ]; then
835 __gitcomp_nl
"$(__git_refs "$remote")" "$pfx" "$cur_"
837 __gitcomp_nl
"$(__git_refs)" "$pfx" "$cur_"
841 if [ $lhs = 1 ]; then
842 __gitcomp_nl
"$(__git_refs)" "$pfx" "$cur_"
844 __gitcomp_nl
"$(__git_refs "$remote")" "$pfx" "$cur_"
850 __git_complete_strategy
()
852 __git_compute_merge_strategies
855 __gitcomp
"$__git_merge_strategies"
860 __gitcomp
"$__git_merge_strategies" "" "${cur##--strategy=}"
867 __git_list_all_commands
()
870 for i
in $
(git
help -a|
egrep '^ [a-zA-Z0-9]')
873 *--*) : helper pattern
;;
880 __git_compute_all_commands
()
882 : ${__git_all_commands:=$(__git_list_all_commands)}
885 __git_list_porcelain_commands
()
888 __git_compute_all_commands
889 for i
in "help" $__git_all_commands
892 *--*) : helper pattern
;;
893 applymbox
) : ask gittus
;;
894 applypatch
) : ask gittus
;;
895 archimport
) : import
;;
896 cat-file
) : plumbing
;;
897 check-attr
) : plumbing
;;
898 check-ref-format
) : plumbing
;;
899 checkout-index
) : plumbing
;;
900 commit-tree
) : plumbing
;;
901 count-objects
) : infrequent
;;
902 cvsexportcommit
) : export;;
903 cvsimport
) : import
;;
904 cvsserver
) : daemon
;;
906 diff-files
) : plumbing
;;
907 diff-index
) : plumbing
;;
908 diff-tree
) : plumbing
;;
909 fast-import
) : import
;;
910 fast-export
) : export;;
911 fsck-objects
) : plumbing
;;
912 fetch-pack
) : plumbing
;;
913 fmt-merge-msg
) : plumbing
;;
914 for-each-ref
) : plumbing
;;
915 hash-object
) : plumbing
;;
916 http-
*) : transport
;;
917 index-pack
) : plumbing
;;
918 init-db
) : deprecated
;;
919 local-fetch
) : plumbing
;;
920 lost-found
) : infrequent
;;
921 ls-files
) : plumbing
;;
922 ls-remote
) : plumbing
;;
923 ls-tree
) : plumbing
;;
924 mailinfo
) : plumbing
;;
925 mailsplit
) : plumbing
;;
926 merge-
*) : plumbing
;;
929 pack-objects
) : plumbing
;;
930 pack-redundant
) : plumbing
;;
931 pack-refs
) : plumbing
;;
932 parse-remote
) : plumbing
;;
933 patch-id
) : plumbing
;;
934 peek-remote
) : plumbing
;;
936 prune-packed
) : plumbing
;;
937 quiltimport
) : import
;;
938 read-tree
) : plumbing
;;
939 receive-pack
) : plumbing
;;
940 remote-
*) : transport
;;
941 repo-config
) : deprecated
;;
943 rev-list
) : plumbing
;;
944 rev-parse
) : plumbing
;;
945 runstatus
) : plumbing
;;
946 sh-setup
) : internal
;;
948 show-ref
) : plumbing
;;
949 send-pack
) : plumbing
;;
950 show-index
) : plumbing
;;
952 stripspace
) : plumbing
;;
953 symbolic-ref
) : plumbing
;;
954 tar-tree
) : deprecated
;;
955 unpack-file
) : plumbing
;;
956 unpack-objects
) : plumbing
;;
957 update-index
) : plumbing
;;
958 update-ref
) : plumbing
;;
959 update-server-info
) : daemon
;;
960 upload-archive
) : plumbing
;;
961 upload-pack
) : plumbing
;;
962 write-tree
) : plumbing
;;
964 verify-pack
) : infrequent
;;
965 verify-tag
) : plumbing
;;
971 __git_porcelain_commands
=
972 __git_compute_porcelain_commands
()
974 __git_compute_all_commands
975 : ${__git_porcelain_commands:=$(__git_list_porcelain_commands)}
978 __git_pretty_aliases
()
981 for i
in $
(git
--git-dir="$(__gitdir)" config
--get-regexp "pretty\..*" 2>/dev
/null
); do
994 for i
in $
(git
--git-dir="$(__gitdir)" config
--get-regexp "alias\..*" 2>/dev
/null
); do
1004 # __git_aliased_command requires 1 argument
1005 __git_aliased_command
()
1007 local word cmdline
=$
(git
--git-dir="$(__gitdir)" \
1008 config
--get "alias.$1")
1009 for word
in $cmdline; do
1015 \
!*) : shell
command alias ;;
1017 *=*) : setting env
;;
1018 git
) : git itself
;;
1026 # __git_find_on_cmdline requires 1 argument
1027 __git_find_on_cmdline
()
1029 local word subcommand c
=1
1030 while [ $c -lt $cword ]; do
1032 for subcommand
in $1; do
1033 if [ "$subcommand" = "$word" ]; then
1042 __git_has_doubledash
()
1045 while [ $c -lt $cword ]; do
1046 if [ "--" = "${words[c]}" ]; then
1054 __git_whitespacelist
="nowarn warn error error-all fix"
1058 local dir
="$(__gitdir)"
1059 if [ -d "$dir"/rebase-apply
]; then
1060 __gitcomp
"--skip --continue --resolved --abort"
1065 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
1070 --3way --committer-date-is-author-date --ignore-date
1071 --ignore-whitespace --ignore-space-change
1072 --interactive --keep --no-utf8 --signoff --utf8
1073 --whitespace= --scissors
1084 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
1089 --stat --numstat --summary --check --index
1090 --cached --index-info --reverse --reject --unidiff-zero
1091 --apply --no-add --exclude=
1092 --ignore-whitespace --ignore-space-change
1093 --whitespace= --inaccurate-eof --verbose
1102 __git_has_doubledash
&& return
1107 --interactive --refresh --patch --update --dry-run
1108 --ignore-errors --intent-to-add
1119 __gitcomp
"$(git archive --list)" "" "${cur##--format=}"
1123 __gitcomp_nl
"$(__git_remotes)" "" "${cur##--remote=}"
1128 --format= --list --verbose
1129 --prefix= --remote= --exec=
1139 __git_has_doubledash
&& return
1141 local subcommands
="start bad good skip reset visualize replay log run"
1142 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1143 if [ -z "$subcommand" ]; then
1144 if [ -f "$(__gitdir)"/BISECT_START
]; then
1145 __gitcomp
"$subcommands"
1147 __gitcomp
"replay start"
1152 case "$subcommand" in
1153 bad|good|
reset|skip|start
)
1154 __gitcomp_nl
"$(__git_refs)"
1164 local i c
=1 only_local_ref
="n" has_r
="n"
1166 while [ $c -lt $cword ]; do
1169 -d|
-m) only_local_ref
="y" ;;
1178 --color --no-color --verbose --abbrev= --no-abbrev
1179 --track --no-track --contains --merged --no-merged
1184 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
1185 __gitcomp_nl
"$(__git_heads)"
1187 __gitcomp_nl
"$(__git_refs)"
1195 local cmd
="${words[2]}"
1198 __gitcomp
"create list-heads verify unbundle"
1201 # looking for a file
1206 __git_complete_revlist
1215 __git_has_doubledash
&& return
1219 __gitcomp
"diff3 merge" "" "${cur##--conflict=}"
1223 --quiet --ours --theirs --track --no-track --merge
1224 --conflict= --orphan --patch
1228 # check if --track, --no-track, or --no-guess was specified
1229 # if so, disable DWIM mode
1230 local flags
="--track --no-track --no-guess" track
=1
1231 if [ -n "$(__git_find_on_cmdline "$flags")" ]; then
1234 __gitcomp_nl
"$(__git_refs '' $track)"
1241 __gitcomp
"$(__git_refs)"
1248 __gitcomp
"--edit --no-commit"
1251 __gitcomp_nl
"$(__git_refs)"
1258 __git_has_doubledash
&& return
1262 __gitcomp
"--dry-run --quiet"
1295 __git_has_doubledash
&& return
1299 __gitcomp
"default strip verbatim whitespace
1300 " "" "${cur##--cleanup=}"
1303 --reuse-message=*|
--reedit-message=*|\
1304 --fixup=*|
--squash=*)
1305 __gitcomp_nl
"$(__git_refs)" "" "${cur#*=}"
1308 --untracked-files=*)
1309 __gitcomp
"all no normal" "" "${cur##--untracked-files=}"
1314 --all --author= --signoff --verify --no-verify
1315 --edit --amend --include --only --interactive
1316 --dry-run --reuse-message= --reedit-message=
1317 --reset-author --file= --message= --template=
1318 --cleanup= --untracked-files --untracked-files=
1319 --verbose --quiet --fixup= --squash=
1331 --all --tags --contains --abbrev= --candidates=
1332 --exact-match --debug --long --match --always
1336 __gitcomp_nl
"$(__git_refs)"
1339 __git_diff_common_options
="--stat --numstat --shortstat --summary
1340 --patch-with-stat --name-only --name-status --color
1341 --no-color --color-words --no-renames --check
1342 --full-index --binary --abbrev --diff-filter=
1343 --find-copies-harder
1344 --text --ignore-space-at-eol --ignore-space-change
1345 --ignore-all-space --exit-code --quiet --ext-diff
1347 --no-prefix --src-prefix= --dst-prefix=
1348 --inter-hunk-context=
1351 --dirstat --dirstat= --dirstat-by-file
1352 --dirstat-by-file= --cumulative
1357 __git_has_doubledash
&& return
1361 __gitcomp
"--cached --staged --pickaxe-all --pickaxe-regex
1362 --base --ours --theirs --no-index
1363 $__git_diff_common_options
1368 __git_complete_revlist_file
1371 __git_mergetools_common
="diffuse ecmerge emerge kdiff3 meld opendiff
1372 tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc3
1377 __git_has_doubledash
&& return
1381 __gitcomp
"$__git_mergetools_common kompare" "" "${cur##--tool=}"
1385 __gitcomp
"--cached --staged --pickaxe-all --pickaxe-regex
1386 --base --ours --theirs
1387 --no-renames --diff-filter= --find-copies-harder
1388 --relative --ignore-submodules
1396 __git_fetch_options
="
1397 --quiet --verbose --append --upload-pack --force --keep --depth=
1398 --tags --no-tags --all --prune --dry-run
1405 __gitcomp
"$__git_fetch_options"
1409 __git_complete_remote_or_refspec
1412 _git_format_patch
()
1418 " "" "${cur##--thread=}"
1423 --stdout --attach --no-attach --thread --thread=
1425 --numbered --start-number
1428 --signoff --signature --no-signature
1429 --in-reply-to= --cc=
1430 --full-index --binary
1433 --no-prefix --src-prefix= --dst-prefix=
1434 --inline --suffix= --ignore-if-in-upstream
1440 __git_complete_revlist
1448 --tags --root --unreachable --cache --no-reflogs --full
1449 --strict --verbose --lost-found
1461 __gitcomp
"--prune --aggressive"
1475 __git_has_doubledash
&& return
1481 --text --ignore-case --word-regexp --invert-match
1482 --full-name --line-number
1483 --extended-regexp --basic-regexp --fixed-strings
1485 --files-with-matches --name-only
1486 --files-without-match
1489 --and --or --not --all-match
1495 __gitcomp_nl
"$(__git_refs)"
1502 __gitcomp
"--all --info --man --web"
1506 __git_compute_all_commands
1507 __gitcomp
"$__git_all_commands $(__git_aliases)
1508 attributes cli core-tutorial cvs-migration
1509 diffcore gitk glossary hooks ignore modules
1510 namespaces repository-layout tutorial tutorial-2
1520 false true umask group all world everybody
1521 " "" "${cur##--shared=}"
1525 __gitcomp
"--quiet --bare --template= --shared --shared="
1534 __git_has_doubledash
&& return
1538 __gitcomp
"--cached --deleted --modified --others --ignored
1539 --stage --directory --no-empty-directory --unmerged
1540 --killed --exclude= --exclude-from=
1541 --exclude-per-directory= --exclude-standard
1542 --error-unmatch --with-tree= --full-name
1543 --abbrev --ignored --exclude-per-directory
1553 __gitcomp_nl
"$(__git_remotes)"
1561 # Options that go well for log, shortlog and gitk
1562 __git_log_common_options
="
1564 --branches --tags --remotes
1565 --first-parent --merges --no-merges
1567 --max-age= --since= --after=
1568 --min-age= --until= --before=
1569 --min-parents= --max-parents=
1570 --no-min-parents --no-max-parents
1572 # Options that go well for log and gitk (not shortlog)
1573 __git_log_gitk_options
="
1574 --dense --sparse --full-history
1575 --simplify-merges --simplify-by-decoration
1576 --left-right --notes --no-notes
1578 # Options that go well for log and shortlog (not gitk)
1579 __git_log_shortlog_options
="
1580 --author= --committer= --grep=
1584 __git_log_pretty_formats
="oneline short medium full fuller email raw format:"
1585 __git_log_date_formats
="relative iso8601 rfc2822 short local default raw"
1589 __git_has_doubledash
&& return
1591 local g
="$(git rev-parse --git-dir 2>/dev/null)"
1593 if [ -f "$g/MERGE_HEAD" ]; then
1597 --pretty=*|
--format=*)
1598 __gitcomp
"$__git_log_pretty_formats $(__git_pretty_aliases)
1603 __gitcomp
"$__git_log_date_formats" "" "${cur##--date=}"
1607 __gitcomp
"long short" "" "${cur##--decorate=}"
1612 $__git_log_common_options
1613 $__git_log_shortlog_options
1614 $__git_log_gitk_options
1615 --root --topo-order --date-order --reverse
1616 --follow --full-diff
1617 --abbrev-commit --abbrev=
1618 --relative-date --date=
1619 --pretty= --format= --oneline
1622 --decorate --decorate=
1624 --parents --children
1626 $__git_diff_common_options
1627 --pickaxe-all --pickaxe-regex
1632 __git_complete_revlist
1635 __git_merge_options
="
1636 --no-commit --no-stat --log --no-log --squash --strategy
1637 --commit --stat --no-squash --ff --no-ff --ff-only
1642 __git_complete_strategy
&& return
1646 __gitcomp
"$__git_merge_options"
1649 __gitcomp_nl
"$(__git_refs)"
1656 __gitcomp
"$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1669 __gitcomp_nl
"$(__git_refs)"
1676 __gitcomp
"--dry-run"
1685 __gitcomp
"--tags --all --stdin"
1690 local subcommands
='add append copy edit list prune remove show'
1691 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1693 case "$subcommand,$cur" in
1698 case "${words[cword-1]}" in
1700 __gitcomp_nl
"$(__git_refs)"
1703 __gitcomp
"$subcommands --ref"
1707 add
,--reuse-message=*|append
,--reuse-message=*|\
1708 add
,--reedit-message=*|append
,--reedit-message=*)
1709 __gitcomp_nl
"$(__git_refs)" "" "${cur#*=}"
1712 __gitcomp
'--file= --message= --reedit-message=
1719 __gitcomp
'--dry-run --verbose'
1724 case "${words[cword-1]}" in
1728 __gitcomp_nl
"$(__git_refs)"
1737 __git_complete_strategy
&& return
1742 --rebase --no-rebase
1743 $__git_merge_options
1744 $__git_fetch_options
1749 __git_complete_remote_or_refspec
1756 __gitcomp_nl
"$(__git_remotes)"
1761 __gitcomp_nl
"$(__git_remotes)" "" "${cur##--repo=}"
1766 --all --mirror --tags --dry-run --force --verbose
1767 --receive-pack= --repo= --set-upstream
1772 __git_complete_remote_or_refspec
1777 local dir
="$(__gitdir)"
1778 if [ -d "$dir"/rebase-apply
] ||
[ -d "$dir"/rebase-merge
]; then
1779 __gitcomp
"--continue --skip --abort"
1782 __git_complete_strategy
&& return
1785 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
1790 --onto --merge --strategy --interactive
1791 --preserve-merges --stat --no-stat
1792 --committer-date-is-author-date --ignore-date
1793 --ignore-whitespace --whitespace=
1799 __gitcomp_nl
"$(__git_refs)"
1804 local subcommands
="show delete expire"
1805 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1807 if [ -z "$subcommand" ]; then
1808 __gitcomp
"$subcommands"
1810 __gitcomp_nl
"$(__git_refs)"
1814 __git_send_email_confirm_options
="always never auto cc compose"
1815 __git_send_email_suppresscc_options
="author self cc bodycc sob cccmd body all"
1822 $__git_send_email_confirm_options
1823 " "" "${cur##--confirm=}"
1828 $__git_send_email_suppresscc_options
1829 " "" "${cur##--suppress-cc=}"
1833 --smtp-encryption=*)
1834 __gitcomp
"ssl tls" "" "${cur##--smtp-encryption=}"
1838 __gitcomp
"--annotate --bcc --cc --cc-cmd --chain-reply-to
1839 --compose --confirm= --dry-run --envelope-sender
1841 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1842 --no-suppress-from --no-thread --quiet
1843 --signed-off-by-cc --smtp-pass --smtp-server
1844 --smtp-server-port --smtp-encryption= --smtp-user
1845 --subject --suppress-cc= --suppress-from --thread --to
1846 --validate --no-validate"
1858 __git_config_get_set_variables
()
1860 local prevword word config_file
= c
=$cword
1861 while [ $c -gt 1 ]; do
1864 --global|
--system|
--file=*)
1869 config_file
="$word $prevword"
1877 git
--git-dir="$(__gitdir)" config
$config_file --list 2>/dev
/null |
1892 __gitcomp_nl
"$(__git_remotes)"
1896 __gitcomp_nl
"$(__git_refs)"
1900 local remote
="${prev#remote.}"
1901 remote
="${remote%.fetch}"
1902 __gitcomp_nl
"$(__git_refs_remotes "$remote")"
1906 local remote
="${prev#remote.}"
1907 remote
="${remote%.push}"
1908 __gitcomp_nl
"$(git --git-dir="$
(__gitdir
)" \
1909 for-each-ref --format='%(refname):%(refname)' \
1913 pull.twohead|pull.octopus
)
1914 __git_compute_merge_strategies
1915 __gitcomp
"$__git_merge_strategies"
1918 color.branch|color.
diff|color.interactive|\
1919 color.showbranch|color.status|color.ui
)
1920 __gitcomp
"always never auto"
1924 __gitcomp
"false true"
1929 normal black red green yellow blue magenta cyan white
1930 bold dim ul blink reverse
1935 __gitcomp
"man info web html"
1939 __gitcomp
"$__git_log_date_formats"
1942 sendemail.aliasesfiletype
)
1943 __gitcomp
"mutt mailrc pine elm gnus"
1947 __gitcomp
"$__git_send_email_confirm_options"
1950 sendemail.suppresscc
)
1951 __gitcomp
"$__git_send_email_suppresscc_options"
1954 --get|
--get-all|
--unset|
--unset-all)
1955 __gitcomp_nl
"$(__git_config_get_set_variables)"
1966 --global --system --file=
1967 --list --replace-all
1968 --get --get-all --get-regexp
1969 --add --unset --unset-all
1970 --remove-section --rename-section
1975 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1976 __gitcomp
"remote merge mergeoptions rebase" "$pfx" "$cur_"
1980 local pfx
="${cur%.*}." cur_
="${cur#*.}"
1981 __gitcomp_nl
"$(__git_heads)" "$pfx" "$cur_" "."
1985 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1987 argprompt cmd confirm needsfile noconsole norescan
1988 prompt revprompt revunmerged title
1993 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1994 __gitcomp
"cmd path" "$pfx" "$cur_"
1998 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1999 __gitcomp
"cmd path" "$pfx" "$cur_"
2003 local pfx
="${cur%.*}." cur_
="${cur##*.}"
2004 __gitcomp
"cmd path trustExitCode" "$pfx" "$cur_"
2008 local pfx
="${cur%.*}." cur_
="${cur#*.}"
2009 __git_compute_all_commands
2010 __gitcomp_nl
"$__git_all_commands" "$pfx" "$cur_"
2014 local pfx
="${cur%.*}." cur_
="${cur##*.}"
2016 url proxy fetch push mirror skipDefaultUpdate
2017 receivepack uploadpack tagopt pushurl
2022 local pfx
="${cur%.*}." cur_
="${cur#*.}"
2023 __gitcomp_nl
"$(__git_remotes)" "$pfx" "$cur_" "."
2027 local pfx
="${cur%.*}." cur_
="${cur##*.}"
2028 __gitcomp
"insteadOf pushInsteadOf" "$pfx" "$cur_"
2034 advice.commitBeforeMerge
2036 advice.implicitIdentity
2037 advice.pushNonFastForward
2038 advice.resolveConflict
2042 apply.ignorewhitespace
2044 branch.autosetupmerge
2045 branch.autosetuprebase
2049 color.branch.current
2054 color.decorate.branch
2055 color.decorate.remoteBranch
2056 color.decorate.stash
2066 color.diff.whitespace
2071 color.grep.linenumber
2074 color.grep.separator
2076 color.interactive.error
2077 color.interactive.header
2078 color.interactive.help
2079 color.interactive.prompt
2084 color.status.changed
2086 color.status.nobranch
2087 color.status.untracked
2088 color.status.updated
2097 core.bigFileThreshold
2100 core.deltaBaseCacheLimit
2105 core.fsyncobjectfiles
2107 core.ignoreCygwinFSTricks
2110 core.logAllRefUpdates
2111 core.loosecompression
2114 core.packedGitWindowSize
2116 core.preferSymlinkRefs
2119 core.repositoryFormatVersion
2121 core.sharedRepository
2125 core.warnAmbiguousRefs
2128 diff.autorefreshindex
2130 diff.ignoreSubmodules
2135 diff.suppressBlankEmpty
2140 fetch.recurseSubmodules
2149 format.subjectprefix
2160 gc.reflogexpireunreachable
2164 gitcvs.commitmsgannotation
2165 gitcvs.dbTableNamePrefix
2176 gui.copyblamethreshold
2180 gui.matchtrackingbranch
2181 gui.newbranchtemplate
2182 gui.pruneduringfetch
2183 gui.spellingdictionary
2198 http.sslCertPasswordProtected
2203 i18n.logOutputEncoding
2209 imap.preformattedHTML
2219 interactive.singlekey
2235 mergetool.keepBackup
2236 mergetool.keepTemporaries
2241 notes.rewrite.rebase
2245 pack.deltaCacheLimit
2261 receive.denyCurrentBranch
2262 receive.denyDeleteCurrent
2264 receive.denyNonFastForwards
2267 receive.updateserverinfo
2269 repack.usedeltabaseoffset
2273 sendemail.aliasesfile
2274 sendemail.aliasfiletype
2278 sendemail.chainreplyto
2280 sendemail.envelopesender
2284 sendemail.signedoffbycc
2285 sendemail.smtpdomain
2286 sendemail.smtpencryption
2288 sendemail.smtpserver
2289 sendemail.smtpserveroption
2290 sendemail.smtpserverport
2292 sendemail.suppresscc
2293 sendemail.suppressfrom
2298 status.relativePaths
2299 status.showUntrackedFiles
2300 status.submodulesummary
2303 transfer.unpackLimit
2315 local subcommands
="add rename rm show prune update set-head"
2316 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
2317 if [ -z "$subcommand" ]; then
2318 __gitcomp
"$subcommands"
2322 case "$subcommand" in
2323 rename|
rm|show|prune
)
2324 __gitcomp_nl
"$(__git_remotes)"
2327 local i c
='' IFS
=$
'\n'
2328 for i
in $
(git
--git-dir="$(__gitdir)" config
--get-regexp "remotes\..*" 2>/dev
/null
); do
2342 __gitcomp_nl
"$(__git_refs)"
2347 __git_has_doubledash
&& return
2351 __gitcomp
"--merge --mixed --hard --soft --patch"
2355 __gitcomp_nl
"$(__git_refs)"
2362 __gitcomp
"--edit --mainline --no-edit --no-commit --signoff"
2366 __gitcomp_nl
"$(__git_refs)"
2371 __git_has_doubledash
&& return
2375 __gitcomp
"--cached --dry-run --ignore-unmatch --quiet"
2384 __git_has_doubledash
&& return
2389 $__git_log_common_options
2390 $__git_log_shortlog_options
2391 --numbered --summary
2396 __git_complete_revlist
2401 __git_has_doubledash
&& return
2404 --pretty=*|
--format=*)
2405 __gitcomp
"$__git_log_pretty_formats $(__git_pretty_aliases)
2410 __gitcomp
"--pretty= --format= --abbrev-commit --oneline
2411 $__git_diff_common_options
2424 --all --remotes --topo-order --current --more=
2425 --list --independent --merge-base --no-name
2427 --sha1-name --sparse --topics --reflog
2432 __git_complete_revlist
2437 local save_opts
='--keep-index --no-keep-index --quiet --patch'
2438 local subcommands
='save list show apply clear drop pop create branch'
2439 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
2440 if [ -z "$subcommand" ]; then
2443 __gitcomp
"$save_opts"
2446 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2447 __gitcomp
"$subcommands"
2454 case "$subcommand,$cur" in
2456 __gitcomp
"$save_opts"
2459 __gitcomp
"--index --quiet"
2461 show
,--*|drop
,--*|branch
,--*)
2464 show
,*|apply
,*|drop
,*|pop
,*|branch
,*)
2465 __gitcomp_nl
"$(git --git-dir="$
(__gitdir
)" stash list \
2466 | sed -n -e 's/:.*//p')"
2477 __git_has_doubledash
&& return
2479 local subcommands
="add status init update summary foreach sync"
2480 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2483 __gitcomp
"--quiet --cached"
2486 __gitcomp
"$subcommands"
2496 init fetch clone rebase dcommit log find-rev
2497 set-tree commit-diff info create-ignore propget
2498 proplist show-ignore show-externals branch tag blame
2499 migrate mkdirs reset gc
2501 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
2502 if [ -z "$subcommand" ]; then
2503 __gitcomp
"$subcommands"
2505 local remote_opts
="--username= --config-dir= --no-auth-cache"
2507 --follow-parent --authors-file= --repack=
2508 --no-metadata --use-svm-props --use-svnsync-props
2509 --log-window-size= --no-checkout --quiet
2510 --repack-flags --use-log-author --localtime
2511 --ignore-paths= $remote_opts
2514 --template= --shared= --trunk= --tags=
2515 --branches= --stdlayout --minimize-url
2516 --no-metadata --use-svm-props --use-svnsync-props
2517 --rewrite-root= --prefix= --use-log-author
2518 --add-author-from $remote_opts
2521 --edit --rmdir --find-copies-harder --copy-similarity=
2524 case "$subcommand,$cur" in
2526 __gitcomp
"--revision= --fetch-all $fc_opts"
2529 __gitcomp
"--revision= $fc_opts $init_opts"
2532 __gitcomp
"$init_opts"
2536 --merge --strategy= --verbose --dry-run
2537 --fetch-all --no-rebase --commit-url
2538 --revision $cmt_opts $fc_opts
2542 __gitcomp
"--stdin $cmt_opts $fc_opts"
2544 create-ignore
,--*|propget
,--*|proplist
,--*|show-ignore
,--*|\
2545 show-externals
,--*|mkdirs
,--*)
2546 __gitcomp
"--revision="
2550 --limit= --revision= --verbose --incremental
2551 --oneline --show-commit --non-recursive
2552 --authors-file= --color
2557 --merge --verbose --strategy= --local
2558 --fetch-all --dry-run $fc_opts
2562 __gitcomp
"--message= --file= --revision= $cmt_opts"
2568 __gitcomp
"--dry-run --message --tag"
2571 __gitcomp
"--dry-run --message"
2574 __gitcomp
"--git-format"
2578 --config-dir= --ignore-paths= --minimize
2579 --no-auth-cache --username=
2583 __gitcomp
"--revision= --parent"
2595 while [ $c -lt $cword ]; do
2599 __gitcomp_nl
"$(__git_tags)"
2615 __gitcomp_nl
"$(__git_tags)"
2621 __gitcomp_nl
"$(__git_refs)"
2633 local i c
=1 command __git_dir
2635 if [[ -n ${ZSH_VERSION-} ]]; then
2639 # workaround zsh's bug that leaves 'words' as a special
2640 # variable in versions < 4.3.12
2644 local cur words cword prev
2645 _get_comp_words_by_ref
-n =: cur words cword prev
2646 while [ $c -lt $cword ]; do
2649 --git-dir=*) __git_dir
="${i#--git-dir=}" ;;
2650 --bare) __git_dir
="." ;;
2651 --version|
-p|
--paginate) ;;
2652 --help) command="help"; break ;;
2653 *) command="$i"; break ;;
2658 if [ -z "$command" ]; then
2673 *) __git_compute_porcelain_commands
2674 __gitcomp
"$__git_porcelain_commands $(__git_aliases)" ;;
2679 local completion_func
="_git_${command//-/_}"
2680 declare -f $completion_func >/dev
/null
&& $completion_func && return
2682 local expansion
=$
(__git_aliased_command
"$command")
2683 if [ -n "$expansion" ]; then
2684 completion_func
="_git_${expansion//-/_}"
2685 declare -f $completion_func >/dev
/null
&& $completion_func
2691 if [[ -n ${ZSH_VERSION-} ]]; then
2695 # workaround zsh's bug that leaves 'words' as a special
2696 # variable in versions < 4.3.12
2700 local cur words cword prev
2701 _get_comp_words_by_ref
-n =: cur words cword prev
2703 __git_has_doubledash
&& return
2705 local g
="$(__gitdir)"
2707 if [ -f "$g/MERGE_HEAD" ]; then
2713 $__git_log_common_options
2714 $__git_log_gitk_options
2720 __git_complete_revlist
2723 complete
-o bashdefault
-o default
-o nospace
-F _git git
2>/dev
/null \
2724 || complete
-o default
-o nospace
-F _git git
2725 complete
-o bashdefault
-o default
-o nospace
-F _gitk gitk
2>/dev
/null \
2726 || complete
-o default
-o nospace
-F _gitk gitk
2728 # The following are necessary only for Cygwin, and only are needed
2729 # when the user has tab-completed the executable name and consequently
2730 # included the '.exe' suffix.
2732 if [ Cygwin
= "$(uname -o 2>/dev/null)" ]; then
2733 complete
-o bashdefault
-o default
-o nospace
-F _git git.exe
2>/dev
/null \
2734 || complete
-o default
-o nospace
-F _git git.exe
2737 if [[ -n ${ZSH_VERSION-} ]]; then
2740 if [ $# -ne 2 ]; then
2741 echo "USAGE: $0 (-q|-s|-u) <option>" >&2
2749 echo "$0: invalid option: $2" >&2
2753 -q) setopt |
grep -q "$option" ;;
2754 -u) unsetopt
"$option" ;;
2755 -s) setopt
"$option" ;;
2757 echo "$0: invalid flag: $1" >&2