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
23 # 3) Consider changing your PS1 to also show the current branch,
24 # see git-prompt.sh for details.
26 if [[ -n ${ZSH_VERSION-} ]]; then
27 autoload
-U +X bashcompinit
&& bashcompinit
30 case "$COMP_WORDBREAKS" in
32 *) COMP_WORDBREAKS
="$COMP_WORDBREAKS:"
35 # __gitdir accepts 0 or 1 arguments (i.e., location)
36 # returns location of .git repo
39 # Note: this function is duplicated in git-prompt.sh
40 # When updating it, make sure you update the other one to match.
41 if [ -z "${1-}" ]; then
42 if [ -n "${__git_dir-}" ]; then
44 elif [ -n "${GIT_DIR-}" ]; then
45 test -d "${GIT_DIR-}" ||
return 1
47 elif [ -d .git
]; then
50 git rev-parse
--git-dir 2>/dev
/null
52 elif [ -d "$1/.git" ]; then
72 # The following function is based on code from:
74 # bash_completion - programmable completion functions for bash 3.2+
76 # Copyright © 2006-2008, Ian Macdonald <ian@caliban.org>
77 # © 2009-2010, Bash Completion Maintainers
78 # <bash-completion-devel@lists.alioth.debian.org>
80 # This program is free software; you can redistribute it and/or modify
81 # it under the terms of the GNU General Public License as published by
82 # the Free Software Foundation; either version 2, or (at your option)
85 # This program is distributed in the hope that it will be useful,
86 # but WITHOUT ANY WARRANTY; without even the implied warranty of
87 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
88 # GNU General Public License for more details.
90 # You should have received a copy of the GNU General Public License
91 # along with this program; if not, write to the Free Software Foundation,
92 # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
94 # The latest version of this software can be obtained here:
96 # http://bash-completion.alioth.debian.org/
100 # This function can be used to access a tokenized list of words
101 # on the command line:
103 # __git_reassemble_comp_words_by_ref '=:'
104 # if test "${words_[cword_-1]}" = -w
109 # The argument should be a collection of characters from the list of
110 # word completion separators (COMP_WORDBREAKS) to treat as ordinary
113 # This is roughly equivalent to going back in time and setting
114 # COMP_WORDBREAKS to exclude those characters. The intent is to
115 # make option types like --date=<type> and <rev>:<path> easy to
116 # recognize by treating each shell word as a single token.
118 # It is best not to set COMP_WORDBREAKS directly because the value is
119 # shared with other completion scripts. By the time the completion
120 # function gets called, COMP_WORDS has already been populated so local
121 # changes to COMP_WORDBREAKS have no effect.
123 # Output: words_, cword_, cur_.
125 __git_reassemble_comp_words_by_ref
()
127 local exclude i j first
128 # Which word separators to exclude?
129 exclude
="${1//[^$COMP_WORDBREAKS]}"
131 if [ -z "$exclude" ]; then
132 words_
=("${COMP_WORDS[@]}")
135 # List of word completion separators has shrunk;
136 # re-assemble words to complete.
137 for ((i
=0, j
=0; i
< ${#COMP_WORDS[@]}; i
++, j
++)); do
138 # Append each nonempty word consisting of just
139 # word separator characters to the current word.
143 [ -n "${COMP_WORDS[$i]}" ] &&
144 # word consists of excluded word separators
145 [ "${COMP_WORDS[$i]//[^$exclude]}" = "${COMP_WORDS[$i]}" ]
147 # Attach to the previous token,
148 # unless the previous token is the command name.
149 if [ $j -ge 2 ] && [ -n "$first" ]; then
153 words_
[$j]=${words_[j]}${COMP_WORDS[i]}
154 if [ $i = $COMP_CWORD ]; then
157 if (($i < ${#COMP_WORDS[@]} - 1)); then
164 words_
[$j]=${words_[j]}${COMP_WORDS[i]}
165 if [ $i = $COMP_CWORD ]; then
171 if ! type _get_comp_words_by_ref
>/dev
/null
2>&1; then
172 if [[ -z ${ZSH_VERSION:+set} ]]; then
173 _get_comp_words_by_ref
()
175 local exclude cur_ words_ cword_
176 if [ "$1" = "-n" ]; then
180 __git_reassemble_comp_words_by_ref
"$exclude"
181 cur_
=${words_[cword_]}
182 while [ $# -gt 0 ]; do
188 prev
=${words_[$cword_-1]}
191 words
=("${words_[@]}")
201 _get_comp_words_by_ref
()
203 while [ $# -gt 0 ]; do
206 cur
=${COMP_WORDS[COMP_CWORD]}
209 prev
=${COMP_WORDS[COMP_CWORD-1]}
212 words
=("${COMP_WORDS[@]}")
218 # assume COMP_WORDBREAKS is already set sanely
228 # Generates completion reply with compgen, appending a space to possible
229 # completion words, if necessary.
230 # It accepts 1 to 4 arguments:
231 # 1: List of possible completion words.
232 # 2: A prefix to be added to each possible completion word (optional).
233 # 3: Generate possible completion matches for this word (optional).
234 # 4: A suffix to be appended to each possible completion word (optional).
237 local cur_
="${3-$cur}"
245 COMPREPLY
=($
(compgen
-P "${2-}" \
246 -W "$(__gitcomp_1 "${1-}" "${4-}")" \
252 # Generates completion reply with compgen from newline-separated possible
253 # completion words by appending a space to all of them.
254 # It accepts 1 to 4 arguments:
255 # 1: List of possible completion words, separated by a single newline.
256 # 2: A prefix to be added to each possible completion word (optional).
257 # 3: Generate possible completion matches for this word (optional).
258 # 4: A suffix to be appended to each possible completion word instead of
259 # the default space (optional). If specified but empty, nothing is
265 # ZSH would quote the trailing space added with -S. bash users
266 # will appreciate the extra space to compensate the use of -o nospace.
267 if [ -n "${ZSH_VERSION-}" ] && [ "$suffix" = " " ]; then
271 COMPREPLY
=($
(compgen
-P "${2-}" -S "${4- }" -W "$1" -- "${3-$cur}"))
276 local dir
="$(__gitdir)"
277 if [ -d "$dir" ]; then
278 git
--git-dir="$dir" for-each-ref
--format='%(refname:short)' \
286 local dir
="$(__gitdir)"
287 if [ -d "$dir" ]; then
288 git
--git-dir="$dir" for-each-ref
--format='%(refname:short)' \
294 # __git_refs accepts 0, 1 (to pass to __gitdir), or 2 arguments
295 # presence of 2nd argument means use the guess heuristic employed
296 # by checkout for tracking branches
299 local i
hash dir
="$(__gitdir "${1-}")" track
="${2-}"
301 if [ -d "$dir" ]; then
309 for i
in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD
; do
310 if [ -e "$dir/$i" ]; then echo $i; fi
312 format
="refname:short"
313 refs
="refs/tags refs/heads refs/remotes"
316 git
--git-dir="$dir" for-each-ref
--format="%($format)" \
318 if [ -n "$track" ]; then
319 # employ the heuristic used by git checkout
320 # Try to find a remote branch that matches the completion word
321 # but only output if the branch name is unique
323 git
--git-dir="$dir" for-each-ref
--shell --format="ref=%(refname:short)" \
325 while read -r entry
; do
328 if [[ "$ref" == "$cur"* ]]; then
337 git ls-remote
"$dir" "$cur*" 2>/dev
/null | \
338 while read -r hash i
; do
346 git ls-remote
"$dir" HEAD ORIG_HEAD
'refs/tags/*' 'refs/heads/*' 'refs/remotes/*' 2>/dev
/null | \
347 while read -r hash i
; do
350 refs
/*) echo "${i#refs/*/}" ;;
358 # __git_refs2 requires 1 argument (to pass to __git_refs)
362 for i
in $
(__git_refs
"$1"); do
367 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
368 __git_refs_remotes
()
371 git ls-remote
"$1" 'refs/heads/*' 2>/dev
/null | \
372 while read -r hash i
; do
373 echo "$i:refs/remotes/$1/${i#refs/heads/}"
379 local i IFS
=$
'\n' d
="$(__gitdir)"
380 test -d "$d/remotes" && ls -1 "$d/remotes"
381 for i
in $
(git
--git-dir="$d" config
--get-regexp 'remote\..*\.url' 2>/dev
/null
); do
387 __git_list_merge_strategies
()
389 git merge
-s help 2>&1 |
390 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
399 __git_merge_strategies
=
400 # 'git merge -s help' (and thus detection of the merge strategy
401 # list) fails, unfortunately, if run outside of any git working
402 # tree. __git_merge_strategies is set to the empty string in
403 # that case, and the detection will be repeated the next time it
405 __git_compute_merge_strategies
()
407 test -n "$__git_merge_strategies" ||
408 __git_merge_strategies
=$
(__git_list_merge_strategies
)
411 __git_complete_revlist_file
()
413 local pfx
ls ref cur_
="$cur"
433 case "$COMP_WORDBREAKS" in
435 *) pfx
="$ref:$pfx" ;;
438 __gitcomp_nl
"$(git --git-dir="$
(__gitdir
)" ls-tree "$ls" \
439 | sed '/^100... blob /{
455 pfx
="${cur_%...*}..."
457 __gitcomp_nl
"$(__git_refs)" "$pfx" "$cur_"
462 __gitcomp_nl
"$(__git_refs)" "$pfx" "$cur_"
465 __gitcomp_nl
"$(__git_refs)"
471 __git_complete_file
()
473 __git_complete_revlist_file
476 __git_complete_revlist
()
478 __git_complete_revlist_file
481 __git_complete_remote_or_refspec
()
483 local cur_
="$cur" cmd
="${words[1]}"
484 local i c
=2 remote
="" pfx
="" lhs
=1 no_complete_refspec
=0
485 if [ "$cmd" = "remote" ]; then
488 while [ $c -lt $cword ]; do
491 --mirror) [ "$cmd" = "push" ] && no_complete_refspec
=1 ;;
494 push
) no_complete_refspec
=1 ;;
503 *) remote
="$i"; break ;;
507 if [ -z "$remote" ]; then
508 __gitcomp_nl
"$(__git_remotes)"
511 if [ $no_complete_refspec = 1 ]; then
515 [ "$remote" = "." ] && remote
=
518 case "$COMP_WORDBREAKS" in
520 *) pfx
="${cur_%%:*}:" ;;
532 if [ $lhs = 1 ]; then
533 __gitcomp_nl
"$(__git_refs2 "$remote")" "$pfx" "$cur_"
535 __gitcomp_nl
"$(__git_refs)" "$pfx" "$cur_"
539 if [ $lhs = 1 ]; then
540 __gitcomp_nl
"$(__git_refs "$remote")" "$pfx" "$cur_"
542 __gitcomp_nl
"$(__git_refs)" "$pfx" "$cur_"
546 if [ $lhs = 1 ]; then
547 __gitcomp_nl
"$(__git_refs)" "$pfx" "$cur_"
549 __gitcomp_nl
"$(__git_refs "$remote")" "$pfx" "$cur_"
555 __git_complete_strategy
()
557 __git_compute_merge_strategies
560 __gitcomp
"$__git_merge_strategies"
565 __gitcomp
"$__git_merge_strategies" "" "${cur##--strategy=}"
572 __git_list_all_commands
()
575 for i
in $
(git
help -a|
egrep '^ [a-zA-Z0-9]')
578 *--*) : helper pattern
;;
585 __git_compute_all_commands
()
587 test -n "$__git_all_commands" ||
588 __git_all_commands
=$
(__git_list_all_commands
)
591 __git_list_porcelain_commands
()
594 __git_compute_all_commands
595 for i
in "help" $__git_all_commands
598 *--*) : helper pattern
;;
599 applymbox
) : ask gittus
;;
600 applypatch
) : ask gittus
;;
601 archimport
) : import
;;
602 cat-file
) : plumbing
;;
603 check-attr
) : plumbing
;;
604 check-ref-format
) : plumbing
;;
605 checkout-index
) : plumbing
;;
606 commit-tree
) : plumbing
;;
607 count-objects
) : infrequent
;;
608 credential-cache
) : credentials helper
;;
609 credential-store
) : credentials helper
;;
610 cvsexportcommit
) : export;;
611 cvsimport
) : import
;;
612 cvsserver
) : daemon
;;
614 diff-files
) : plumbing
;;
615 diff-index
) : plumbing
;;
616 diff-tree
) : plumbing
;;
617 fast-import
) : import
;;
618 fast-export
) : export;;
619 fsck-objects
) : plumbing
;;
620 fetch-pack
) : plumbing
;;
621 fmt-merge-msg
) : plumbing
;;
622 for-each-ref
) : plumbing
;;
623 hash-object
) : plumbing
;;
624 http-
*) : transport
;;
625 index-pack
) : plumbing
;;
626 init-db
) : deprecated
;;
627 local-fetch
) : plumbing
;;
628 lost-found
) : infrequent
;;
629 ls-files
) : plumbing
;;
630 ls-remote
) : plumbing
;;
631 ls-tree
) : plumbing
;;
632 mailinfo
) : plumbing
;;
633 mailsplit
) : plumbing
;;
634 merge-
*) : plumbing
;;
637 pack-objects
) : plumbing
;;
638 pack-redundant
) : plumbing
;;
639 pack-refs
) : plumbing
;;
640 parse-remote
) : plumbing
;;
641 patch-id
) : plumbing
;;
642 peek-remote
) : plumbing
;;
644 prune-packed
) : plumbing
;;
645 quiltimport
) : import
;;
646 read-tree
) : plumbing
;;
647 receive-pack
) : plumbing
;;
648 remote-
*) : transport
;;
649 repo-config
) : deprecated
;;
651 rev-list
) : plumbing
;;
652 rev-parse
) : plumbing
;;
653 runstatus
) : plumbing
;;
654 sh-setup
) : internal
;;
656 show-ref
) : plumbing
;;
657 send-pack
) : plumbing
;;
658 show-index
) : plumbing
;;
660 stripspace
) : plumbing
;;
661 symbolic-ref
) : plumbing
;;
662 tar-tree
) : deprecated
;;
663 unpack-file
) : plumbing
;;
664 unpack-objects
) : plumbing
;;
665 update-index
) : plumbing
;;
666 update-ref
) : plumbing
;;
667 update-server-info
) : daemon
;;
668 upload-archive
) : plumbing
;;
669 upload-pack
) : plumbing
;;
670 write-tree
) : plumbing
;;
672 verify-pack
) : infrequent
;;
673 verify-tag
) : plumbing
;;
679 __git_porcelain_commands
=
680 __git_compute_porcelain_commands
()
682 __git_compute_all_commands
683 test -n "$__git_porcelain_commands" ||
684 __git_porcelain_commands
=$
(__git_list_porcelain_commands
)
687 __git_pretty_aliases
()
690 for i
in $
(git
--git-dir="$(__gitdir)" config
--get-regexp "pretty\..*" 2>/dev
/null
); do
703 for i
in $
(git
--git-dir="$(__gitdir)" config
--get-regexp "alias\..*" 2>/dev
/null
); do
713 # __git_aliased_command requires 1 argument
714 __git_aliased_command
()
716 local word cmdline
=$
(git
--git-dir="$(__gitdir)" \
717 config
--get "alias.$1")
718 for word
in $cmdline; do
724 \
!*) : shell
command alias ;;
726 *=*) : setting env
;;
735 # __git_find_on_cmdline requires 1 argument
736 __git_find_on_cmdline
()
738 local word subcommand c
=1
739 while [ $c -lt $cword ]; do
741 for subcommand
in $1; do
742 if [ "$subcommand" = "$word" ]; then
751 __git_has_doubledash
()
754 while [ $c -lt $cword ]; do
755 if [ "--" = "${words[c]}" ]; then
763 __git_whitespacelist
="nowarn warn error error-all fix"
767 local dir
="$(__gitdir)"
768 if [ -d "$dir"/rebase-apply
]; then
769 __gitcomp
"--skip --continue --resolved --abort"
774 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
779 --3way --committer-date-is-author-date --ignore-date
780 --ignore-whitespace --ignore-space-change
781 --interactive --keep --no-utf8 --signoff --utf8
782 --whitespace= --scissors
793 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
798 --stat --numstat --summary --check --index
799 --cached --index-info --reverse --reject --unidiff-zero
800 --apply --no-add --exclude=
801 --ignore-whitespace --ignore-space-change
802 --whitespace= --inaccurate-eof --verbose
811 __git_has_doubledash
&& return
816 --interactive --refresh --patch --update --dry-run
817 --ignore-errors --intent-to-add
828 __gitcomp
"$(git archive --list)" "" "${cur##--format=}"
832 __gitcomp_nl
"$(__git_remotes)" "" "${cur##--remote=}"
837 --format= --list --verbose
838 --prefix= --remote= --exec=
848 __git_has_doubledash
&& return
850 local subcommands
="start bad good skip reset visualize replay log run"
851 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
852 if [ -z "$subcommand" ]; then
853 if [ -f "$(__gitdir)"/BISECT_START
]; then
854 __gitcomp
"$subcommands"
856 __gitcomp
"replay start"
861 case "$subcommand" in
862 bad|good|
reset|skip|start
)
863 __gitcomp_nl
"$(__git_refs)"
873 local i c
=1 only_local_ref
="n" has_r
="n"
875 while [ $c -lt $cword ]; do
878 -d|
-m) only_local_ref
="y" ;;
886 __gitcomp
"$(__git_refs)" "" "${cur##--set-upstream-to=}"
890 --color --no-color --verbose --abbrev= --no-abbrev
891 --track --no-track --contains --merged --no-merged
892 --set-upstream-to= --edit-description --list
897 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
898 __gitcomp_nl
"$(__git_heads)"
900 __gitcomp_nl
"$(__git_refs)"
908 local cmd
="${words[2]}"
911 __gitcomp
"create list-heads verify unbundle"
919 __git_complete_revlist
928 __git_has_doubledash
&& return
932 __gitcomp
"diff3 merge" "" "${cur##--conflict=}"
936 --quiet --ours --theirs --track --no-track --merge
937 --conflict= --orphan --patch
941 # check if --track, --no-track, or --no-guess was specified
942 # if so, disable DWIM mode
943 local flags
="--track --no-track --no-guess" track
=1
944 if [ -n "$(__git_find_on_cmdline "$flags")" ]; then
947 __gitcomp_nl
"$(__git_refs '' $track)"
954 __gitcomp
"$(__git_refs)"
961 __gitcomp
"--edit --no-commit"
964 __gitcomp_nl
"$(__git_refs)"
971 __git_has_doubledash
&& return
975 __gitcomp
"--dry-run --quiet"
1008 __git_has_doubledash
&& return
1012 __gitcomp
"default strip verbatim whitespace
1013 " "" "${cur##--cleanup=}"
1016 --reuse-message=*|
--reedit-message=*|\
1017 --fixup=*|
--squash=*)
1018 __gitcomp_nl
"$(__git_refs)" "" "${cur#*=}"
1021 --untracked-files=*)
1022 __gitcomp
"all no normal" "" "${cur##--untracked-files=}"
1027 --all --author= --signoff --verify --no-verify
1029 --amend --include --only --interactive
1030 --dry-run --reuse-message= --reedit-message=
1031 --reset-author --file= --message= --template=
1032 --cleanup= --untracked-files --untracked-files=
1033 --verbose --quiet --fixup= --squash=
1045 --all --tags --contains --abbrev= --candidates=
1046 --exact-match --debug --long --match --always
1050 __gitcomp_nl
"$(__git_refs)"
1053 __git_diff_common_options
="--stat --numstat --shortstat --summary
1054 --patch-with-stat --name-only --name-status --color
1055 --no-color --color-words --no-renames --check
1056 --full-index --binary --abbrev --diff-filter=
1057 --find-copies-harder
1058 --text --ignore-space-at-eol --ignore-space-change
1059 --ignore-all-space --exit-code --quiet --ext-diff
1061 --no-prefix --src-prefix= --dst-prefix=
1062 --inter-hunk-context=
1065 --dirstat --dirstat= --dirstat-by-file
1066 --dirstat-by-file= --cumulative
1071 __git_has_doubledash
&& return
1075 __gitcomp
"--cached --staged --pickaxe-all --pickaxe-regex
1076 --base --ours --theirs --no-index
1077 $__git_diff_common_options
1082 __git_complete_revlist_file
1085 __git_mergetools_common
="diffuse ecmerge emerge kdiff3 meld opendiff
1086 tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc3 codecompare
1091 __git_has_doubledash
&& return
1095 __gitcomp
"$__git_mergetools_common kompare" "" "${cur##--tool=}"
1099 __gitcomp
"--cached --staged --pickaxe-all --pickaxe-regex
1100 --base --ours --theirs
1101 --no-renames --diff-filter= --find-copies-harder
1102 --relative --ignore-submodules
1110 __git_fetch_options
="
1111 --quiet --verbose --append --upload-pack --force --keep --depth=
1112 --tags --no-tags --all --prune --dry-run
1119 __gitcomp
"$__git_fetch_options"
1123 __git_complete_remote_or_refspec
1126 _git_format_patch
()
1132 " "" "${cur##--thread=}"
1137 --stdout --attach --no-attach --thread --thread=
1139 --numbered --start-number
1142 --signoff --signature --no-signature
1143 --in-reply-to= --cc=
1144 --full-index --binary
1147 --no-prefix --src-prefix= --dst-prefix=
1148 --inline --suffix= --ignore-if-in-upstream
1154 __git_complete_revlist
1162 --tags --root --unreachable --cache --no-reflogs --full
1163 --strict --verbose --lost-found
1175 __gitcomp
"--prune --aggressive"
1187 __git_match_ctag
() {
1188 awk "/^${1////\\/}/ { print \$1 }" "$2"
1193 __git_has_doubledash
&& return
1199 --text --ignore-case --word-regexp --invert-match
1200 --full-name --line-number
1201 --extended-regexp --basic-regexp --fixed-strings
1203 --files-with-matches --name-only
1204 --files-without-match
1207 --and --or --not --all-match
1213 case "$cword,$prev" in
1215 if test -r tags
; then
1216 __gitcomp_nl
"$(__git_match_ctag "$cur" tags)"
1222 __gitcomp_nl
"$(__git_refs)"
1229 __gitcomp
"--all --info --man --web"
1233 __git_compute_all_commands
1234 __gitcomp
"$__git_all_commands $(__git_aliases)
1235 attributes cli core-tutorial cvs-migration
1236 diffcore gitk glossary hooks ignore modules
1237 namespaces repository-layout tutorial tutorial-2
1247 false true umask group all world everybody
1248 " "" "${cur##--shared=}"
1252 __gitcomp
"--quiet --bare --template= --shared --shared="
1261 __git_has_doubledash
&& return
1265 __gitcomp
"--cached --deleted --modified --others --ignored
1266 --stage --directory --no-empty-directory --unmerged
1267 --killed --exclude= --exclude-from=
1268 --exclude-per-directory= --exclude-standard
1269 --error-unmatch --with-tree= --full-name
1270 --abbrev --ignored --exclude-per-directory
1280 __gitcomp_nl
"$(__git_remotes)"
1288 # Options that go well for log, shortlog and gitk
1289 __git_log_common_options
="
1291 --branches --tags --remotes
1292 --first-parent --merges --no-merges
1294 --max-age= --since= --after=
1295 --min-age= --until= --before=
1296 --min-parents= --max-parents=
1297 --no-min-parents --no-max-parents
1299 # Options that go well for log and gitk (not shortlog)
1300 __git_log_gitk_options
="
1301 --dense --sparse --full-history
1302 --simplify-merges --simplify-by-decoration
1303 --left-right --notes --no-notes
1305 # Options that go well for log and shortlog (not gitk)
1306 __git_log_shortlog_options
="
1307 --author= --committer= --grep=
1311 __git_log_pretty_formats
="oneline short medium full fuller email raw format:"
1312 __git_log_date_formats
="relative iso8601 rfc2822 short local default raw"
1316 __git_has_doubledash
&& return
1318 local g
="$(git rev-parse --git-dir 2>/dev/null)"
1320 if [ -f "$g/MERGE_HEAD" ]; then
1324 --pretty=*|
--format=*)
1325 __gitcomp
"$__git_log_pretty_formats $(__git_pretty_aliases)
1330 __gitcomp
"$__git_log_date_formats" "" "${cur##--date=}"
1334 __gitcomp
"long short" "" "${cur##--decorate=}"
1339 $__git_log_common_options
1340 $__git_log_shortlog_options
1341 $__git_log_gitk_options
1342 --root --topo-order --date-order --reverse
1343 --follow --full-diff
1344 --abbrev-commit --abbrev=
1345 --relative-date --date=
1346 --pretty= --format= --oneline
1349 --decorate --decorate=
1351 --parents --children
1353 $__git_diff_common_options
1354 --pickaxe-all --pickaxe-regex
1359 __git_complete_revlist
1362 __git_merge_options
="
1363 --no-commit --no-stat --log --no-log --squash --strategy
1364 --commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit
1369 __git_complete_strategy
&& return
1373 __gitcomp
"$__git_merge_options"
1376 __gitcomp_nl
"$(__git_refs)"
1383 __gitcomp
"$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1396 __gitcomp_nl
"$(__git_refs)"
1403 __gitcomp
"--dry-run"
1412 __gitcomp
"--tags --all --stdin"
1417 local subcommands
='add append copy edit list prune remove show'
1418 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1420 case "$subcommand,$cur" in
1427 __gitcomp_nl
"$(__git_refs)"
1430 __gitcomp
"$subcommands --ref"
1434 add
,--reuse-message=*|append
,--reuse-message=*|\
1435 add
,--reedit-message=*|append
,--reedit-message=*)
1436 __gitcomp_nl
"$(__git_refs)" "" "${cur#*=}"
1439 __gitcomp
'--file= --message= --reedit-message=
1446 __gitcomp
'--dry-run --verbose'
1455 __gitcomp_nl
"$(__git_refs)"
1465 clone sync rebase submit
1467 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1468 if [ -z "$subcommand" ]; then
1469 __gitcomp
"$subcommands"
1471 local common_opts
="--git-dir= --verbose"
1473 --branch= --detect-branches --changes-file=
1474 --silent --detect-labels --import-labels
1475 --import-local --max-changes= --keep-path
1476 --use-client-spec $common_opts
1479 --destination= --bare $sync_opts
1482 --origin= -M --preserve-user --export-labels
1486 case "$subcommand,$cur" in
1488 __gitcomp
"$clone_opts"
1491 __gitcomp
"$sync_opts"
1494 __gitcomp
"$common_opts --import-labels"
1497 __gitcomp
"$submit_opts"
1500 __gitcomp
"$(__git_refs)"
1508 __git_complete_strategy
&& return
1513 --rebase --no-rebase
1514 $__git_merge_options
1515 $__git_fetch_options
1520 __git_complete_remote_or_refspec
1527 __gitcomp_nl
"$(__git_remotes)"
1532 __gitcomp_nl
"$(__git_remotes)" "" "${cur##--repo=}"
1537 --all --mirror --tags --dry-run --force --verbose
1538 --receive-pack= --repo= --set-upstream
1543 __git_complete_remote_or_refspec
1548 local dir
="$(__gitdir)"
1549 if [ -d "$dir"/rebase-apply
] ||
[ -d "$dir"/rebase-merge
]; then
1550 __gitcomp
"--continue --skip --abort"
1553 __git_complete_strategy
&& return
1556 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
1561 --onto --merge --strategy --interactive
1562 --preserve-merges --stat --no-stat
1563 --committer-date-is-author-date --ignore-date
1564 --ignore-whitespace --whitespace=
1570 __gitcomp_nl
"$(__git_refs)"
1575 local subcommands
="show delete expire"
1576 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1578 if [ -z "$subcommand" ]; then
1579 __gitcomp
"$subcommands"
1581 __gitcomp_nl
"$(__git_refs)"
1585 __git_send_email_confirm_options
="always never auto cc compose"
1586 __git_send_email_suppresscc_options
="author self cc bodycc sob cccmd body all"
1593 $__git_send_email_confirm_options
1594 " "" "${cur##--confirm=}"
1599 $__git_send_email_suppresscc_options
1600 " "" "${cur##--suppress-cc=}"
1604 --smtp-encryption=*)
1605 __gitcomp
"ssl tls" "" "${cur##--smtp-encryption=}"
1609 __gitcomp
"--annotate --bcc --cc --cc-cmd --chain-reply-to
1610 --compose --confirm= --dry-run --envelope-sender
1612 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1613 --no-suppress-from --no-thread --quiet
1614 --signed-off-by-cc --smtp-pass --smtp-server
1615 --smtp-server-port --smtp-encryption= --smtp-user
1616 --subject --suppress-cc= --suppress-from --thread --to
1617 --validate --no-validate"
1629 __git_config_get_set_variables
()
1631 local prevword word config_file
= c
=$cword
1632 while [ $c -gt 1 ]; do
1635 --global|
--system|
--file=*)
1640 config_file
="$word $prevword"
1648 git
--git-dir="$(__gitdir)" config
$config_file --list 2>/dev
/null |
1663 __gitcomp_nl
"$(__git_remotes)"
1667 __gitcomp_nl
"$(__git_refs)"
1671 local remote
="${prev#remote.}"
1672 remote
="${remote%.fetch}"
1673 if [ -z "$cur" ]; then
1674 COMPREPLY
=("refs/heads/")
1677 __gitcomp_nl
"$(__git_refs_remotes "$remote")"
1681 local remote
="${prev#remote.}"
1682 remote
="${remote%.push}"
1683 __gitcomp_nl
"$(git --git-dir="$
(__gitdir
)" \
1684 for-each-ref --format='%(refname):%(refname)' \
1688 pull.twohead|pull.octopus
)
1689 __git_compute_merge_strategies
1690 __gitcomp
"$__git_merge_strategies"
1693 color.branch|color.
diff|color.interactive|\
1694 color.showbranch|color.status|color.ui
)
1695 __gitcomp
"always never auto"
1699 __gitcomp
"false true"
1704 normal black red green yellow blue magenta cyan white
1705 bold dim ul blink reverse
1710 __gitcomp
"man info web html"
1714 __gitcomp
"$__git_log_date_formats"
1717 sendemail.aliasesfiletype
)
1718 __gitcomp
"mutt mailrc pine elm gnus"
1722 __gitcomp
"$__git_send_email_confirm_options"
1725 sendemail.suppresscc
)
1726 __gitcomp
"$__git_send_email_suppresscc_options"
1729 --get|
--get-all|
--unset|
--unset-all)
1730 __gitcomp_nl
"$(__git_config_get_set_variables)"
1741 --global --system --file=
1742 --list --replace-all
1743 --get --get-all --get-regexp
1744 --add --unset --unset-all
1745 --remove-section --rename-section
1750 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1751 __gitcomp
"remote merge mergeoptions rebase" "$pfx" "$cur_"
1755 local pfx
="${cur%.*}." cur_
="${cur#*.}"
1756 __gitcomp_nl
"$(__git_heads)" "$pfx" "$cur_" "."
1760 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1762 argprompt cmd confirm needsfile noconsole norescan
1763 prompt revprompt revunmerged title
1768 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1769 __gitcomp
"cmd path" "$pfx" "$cur_"
1773 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1774 __gitcomp
"cmd path" "$pfx" "$cur_"
1778 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1779 __gitcomp
"cmd path trustExitCode" "$pfx" "$cur_"
1783 local pfx
="${cur%.*}." cur_
="${cur#*.}"
1784 __git_compute_all_commands
1785 __gitcomp_nl
"$__git_all_commands" "$pfx" "$cur_"
1789 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1791 url proxy fetch push mirror skipDefaultUpdate
1792 receivepack uploadpack tagopt pushurl
1797 local pfx
="${cur%.*}." cur_
="${cur#*.}"
1798 __gitcomp_nl
"$(__git_remotes)" "$pfx" "$cur_" "."
1802 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1803 __gitcomp
"insteadOf pushInsteadOf" "$pfx" "$cur_"
1809 advice.commitBeforeMerge
1811 advice.implicitIdentity
1812 advice.pushNonFastForward
1813 advice.resolveConflict
1817 apply.ignorewhitespace
1819 branch.autosetupmerge
1820 branch.autosetuprebase
1824 color.branch.current
1829 color.decorate.branch
1830 color.decorate.remoteBranch
1831 color.decorate.stash
1841 color.diff.whitespace
1846 color.grep.linenumber
1849 color.grep.separator
1851 color.interactive.error
1852 color.interactive.header
1853 color.interactive.help
1854 color.interactive.prompt
1859 color.status.changed
1861 color.status.nobranch
1862 color.status.untracked
1863 color.status.updated
1872 core.bigFileThreshold
1875 core.deltaBaseCacheLimit
1880 core.fsyncobjectfiles
1882 core.ignoreCygwinFSTricks
1885 core.logAllRefUpdates
1886 core.loosecompression
1889 core.packedGitWindowSize
1891 core.preferSymlinkRefs
1894 core.repositoryFormatVersion
1896 core.sharedRepository
1900 core.warnAmbiguousRefs
1903 diff.autorefreshindex
1906 diff.ignoreSubmodules
1911 diff.suppressBlankEmpty
1916 fetch.recurseSubmodules
1925 format.subjectprefix
1936 gc.reflogexpireunreachable
1940 gitcvs.commitmsgannotation
1941 gitcvs.dbTableNamePrefix
1952 gui.copyblamethreshold
1956 gui.matchtrackingbranch
1957 gui.newbranchtemplate
1958 gui.pruneduringfetch
1959 gui.spellingdictionary
1974 http.sslCertPasswordProtected
1979 i18n.logOutputEncoding
1985 imap.preformattedHTML
1995 interactive.singlekey
2011 mergetool.keepBackup
2012 mergetool.keepTemporaries
2017 notes.rewrite.rebase
2021 pack.deltaCacheLimit
2037 receive.denyCurrentBranch
2038 receive.denyDeleteCurrent
2040 receive.denyNonFastForwards
2043 receive.updateserverinfo
2045 repack.usedeltabaseoffset
2049 sendemail.aliasesfile
2050 sendemail.aliasfiletype
2054 sendemail.chainreplyto
2056 sendemail.envelopesender
2060 sendemail.signedoffbycc
2061 sendemail.smtpdomain
2062 sendemail.smtpencryption
2064 sendemail.smtpserver
2065 sendemail.smtpserveroption
2066 sendemail.smtpserverport
2068 sendemail.suppresscc
2069 sendemail.suppressfrom
2074 status.relativePaths
2075 status.showUntrackedFiles
2076 status.submodulesummary
2079 transfer.unpackLimit
2091 local subcommands
="add rename remove set-head set-branches set-url show prune update"
2092 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
2093 if [ -z "$subcommand" ]; then
2094 __gitcomp
"$subcommands"
2098 case "$subcommand" in
2099 rename|remove|set-url|show|prune
)
2100 __gitcomp_nl
"$(__git_remotes)"
2102 set-head|set-branches
)
2103 __git_complete_remote_or_refspec
2106 local i c
='' IFS
=$
'\n'
2107 for i
in $
(git
--git-dir="$(__gitdir)" config
--get-regexp "remotes\..*" 2>/dev
/null
); do
2121 __gitcomp_nl
"$(__git_refs)"
2126 __git_has_doubledash
&& return
2130 __gitcomp
"--merge --mixed --hard --soft --patch"
2134 __gitcomp_nl
"$(__git_refs)"
2141 __gitcomp
"--edit --mainline --no-edit --no-commit --signoff"
2145 __gitcomp_nl
"$(__git_refs)"
2150 __git_has_doubledash
&& return
2154 __gitcomp
"--cached --dry-run --ignore-unmatch --quiet"
2163 __git_has_doubledash
&& return
2168 $__git_log_common_options
2169 $__git_log_shortlog_options
2170 --numbered --summary
2175 __git_complete_revlist
2180 __git_has_doubledash
&& return
2183 --pretty=*|
--format=*)
2184 __gitcomp
"$__git_log_pretty_formats $(__git_pretty_aliases)
2189 __gitcomp
"--pretty= --format= --abbrev-commit --oneline
2190 $__git_diff_common_options
2203 --all --remotes --topo-order --current --more=
2204 --list --independent --merge-base --no-name
2206 --sha1-name --sparse --topics --reflog
2211 __git_complete_revlist
2216 local save_opts
='--keep-index --no-keep-index --quiet --patch'
2217 local subcommands
='save list show apply clear drop pop create branch'
2218 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
2219 if [ -z "$subcommand" ]; then
2222 __gitcomp
"$save_opts"
2225 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2226 __gitcomp
"$subcommands"
2233 case "$subcommand,$cur" in
2235 __gitcomp
"$save_opts"
2238 __gitcomp
"--index --quiet"
2240 show
,--*|drop
,--*|branch
,--*)
2243 show
,*|apply
,*|drop
,*|pop
,*|branch
,*)
2244 __gitcomp_nl
"$(git --git-dir="$
(__gitdir
)" stash list \
2245 | sed -n -e 's/:.*//p')"
2256 __git_has_doubledash
&& return
2258 local subcommands
="add status init update summary foreach sync"
2259 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2262 __gitcomp
"--quiet --cached"
2265 __gitcomp
"$subcommands"
2275 init fetch clone rebase dcommit log find-rev
2276 set-tree commit-diff info create-ignore propget
2277 proplist show-ignore show-externals branch tag blame
2278 migrate mkdirs reset gc
2280 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
2281 if [ -z "$subcommand" ]; then
2282 __gitcomp
"$subcommands"
2284 local remote_opts
="--username= --config-dir= --no-auth-cache"
2286 --follow-parent --authors-file= --repack=
2287 --no-metadata --use-svm-props --use-svnsync-props
2288 --log-window-size= --no-checkout --quiet
2289 --repack-flags --use-log-author --localtime
2290 --ignore-paths= $remote_opts
2293 --template= --shared= --trunk= --tags=
2294 --branches= --stdlayout --minimize-url
2295 --no-metadata --use-svm-props --use-svnsync-props
2296 --rewrite-root= --prefix= --use-log-author
2297 --add-author-from $remote_opts
2300 --edit --rmdir --find-copies-harder --copy-similarity=
2303 case "$subcommand,$cur" in
2305 __gitcomp
"--revision= --fetch-all $fc_opts"
2308 __gitcomp
"--revision= $fc_opts $init_opts"
2311 __gitcomp
"$init_opts"
2315 --merge --strategy= --verbose --dry-run
2316 --fetch-all --no-rebase --commit-url
2317 --revision --interactive $cmt_opts $fc_opts
2321 __gitcomp
"--stdin $cmt_opts $fc_opts"
2323 create-ignore
,--*|propget
,--*|proplist
,--*|show-ignore
,--*|\
2324 show-externals
,--*|mkdirs
,--*)
2325 __gitcomp
"--revision="
2329 --limit= --revision= --verbose --incremental
2330 --oneline --show-commit --non-recursive
2331 --authors-file= --color
2336 --merge --verbose --strategy= --local
2337 --fetch-all --dry-run $fc_opts
2341 __gitcomp
"--message= --file= --revision= $cmt_opts"
2347 __gitcomp
"--dry-run --message --tag"
2350 __gitcomp
"--dry-run --message"
2353 __gitcomp
"--git-format"
2357 --config-dir= --ignore-paths= --minimize
2358 --no-auth-cache --username=
2362 __gitcomp
"--revision= --parent"
2374 while [ $c -lt $cword ]; do
2378 __gitcomp_nl
"$(__git_tags)"
2394 __gitcomp_nl
"$(__git_tags)"
2400 __gitcomp_nl
"$(__git_refs)"
2412 local i c
=1 command __git_dir
2414 while [ $c -lt $cword ]; do
2417 --git-dir=*) __git_dir
="${i#--git-dir=}" ;;
2418 --bare) __git_dir
="." ;;
2419 --help) command="help"; break ;;
2422 *) command="$i"; break ;;
2427 if [ -z "$command" ]; then
2441 --no-replace-objects
2445 *) __git_compute_porcelain_commands
2446 __gitcomp
"$__git_porcelain_commands $(__git_aliases)" ;;
2451 local completion_func
="_git_${command//-/_}"
2452 declare -f $completion_func >/dev
/null
&& $completion_func && return
2454 local expansion
=$
(__git_aliased_command
"$command")
2455 if [ -n "$expansion" ]; then
2456 completion_func
="_git_${expansion//-/_}"
2457 declare -f $completion_func >/dev
/null
&& $completion_func
2463 __git_has_doubledash
&& return
2465 local g
="$(__gitdir)"
2467 if [ -f "$g/MERGE_HEAD" ]; then
2473 $__git_log_common_options
2474 $__git_log_gitk_options
2480 __git_complete_revlist
2485 if [[ -n ${ZSH_VERSION-} ]]; then
2489 # workaround zsh's bug that leaves 'words' as a special
2490 # variable in versions < 4.3.12
2493 # workaround zsh's bug that quotes spaces in the COMPREPLY
2494 # array if IFS doesn't contain spaces.
2497 local cur words cword prev
2498 _get_comp_words_by_ref
-n =: cur words cword prev
2502 # Setup completion for certain functions defined above by setting common
2503 # variables and workarounds.
2504 # This is NOT a public function; use at your own risk.
2507 local wrapper
="__git_wrap${2}"
2508 eval "$wrapper () { __git_func_wrap $2 ; }"
2509 complete
-o bashdefault
-o default
-o nospace
-F $wrapper $1 2>/dev
/null \
2510 || complete
-o default
-o nospace
-F $wrapper $1
2513 # wrapper for backwards compatibility
2516 __git_wrap__git_main
2519 # wrapper for backwards compatibility
2522 __git_wrap__gitk_main
2525 __git_complete git __git_main
2526 __git_complete gitk __gitk_main
2528 # The following are necessary only for Cygwin, and only are needed
2529 # when the user has tab-completed the executable name and consequently
2530 # included the '.exe' suffix.
2532 if [ Cygwin
= "$(uname -o 2>/dev/null)" ]; then
2533 __git_complete git.exe __git_main