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 case "$COMP_WORDBREAKS" in
28 *) COMP_WORDBREAKS
="$COMP_WORDBREAKS:"
31 # __gitdir accepts 0 or 1 arguments (i.e., location)
32 # returns location of .git repo
35 # Note: this function is duplicated in git-prompt.sh
36 # When updating it, make sure you update the other one to match.
37 if [ -z "${1-}" ]; then
38 if [ -n "${__git_dir-}" ]; then
40 elif [ -n "${GIT_DIR-}" ]; then
41 test -d "${GIT_DIR-}" ||
return 1
43 elif [ -d .git
]; then
46 git rev-parse
--git-dir 2>/dev
/null
48 elif [ -d "$1/.git" ]; then
68 # The following function is based on code from:
70 # bash_completion - programmable completion functions for bash 3.2+
72 # Copyright © 2006-2008, Ian Macdonald <ian@caliban.org>
73 # © 2009-2010, Bash Completion Maintainers
74 # <bash-completion-devel@lists.alioth.debian.org>
76 # This program is free software; you can redistribute it and/or modify
77 # it under the terms of the GNU General Public License as published by
78 # the Free Software Foundation; either version 2, or (at your option)
81 # This program is distributed in the hope that it will be useful,
82 # but WITHOUT ANY WARRANTY; without even the implied warranty of
83 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
84 # GNU General Public License for more details.
86 # You should have received a copy of the GNU General Public License
87 # along with this program; if not, write to the Free Software Foundation,
88 # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
90 # The latest version of this software can be obtained here:
92 # http://bash-completion.alioth.debian.org/
96 # This function can be used to access a tokenized list of words
97 # on the command line:
99 # __git_reassemble_comp_words_by_ref '=:'
100 # if test "${words_[cword_-1]}" = -w
105 # The argument should be a collection of characters from the list of
106 # word completion separators (COMP_WORDBREAKS) to treat as ordinary
109 # This is roughly equivalent to going back in time and setting
110 # COMP_WORDBREAKS to exclude those characters. The intent is to
111 # make option types like --date=<type> and <rev>:<path> easy to
112 # recognize by treating each shell word as a single token.
114 # It is best not to set COMP_WORDBREAKS directly because the value is
115 # shared with other completion scripts. By the time the completion
116 # function gets called, COMP_WORDS has already been populated so local
117 # changes to COMP_WORDBREAKS have no effect.
119 # Output: words_, cword_, cur_.
121 __git_reassemble_comp_words_by_ref
()
123 local exclude i j first
124 # Which word separators to exclude?
125 exclude
="${1//[^$COMP_WORDBREAKS]}"
127 if [ -z "$exclude" ]; then
128 words_
=("${COMP_WORDS[@]}")
131 # List of word completion separators has shrunk;
132 # re-assemble words to complete.
133 for ((i
=0, j
=0; i
< ${#COMP_WORDS[@]}; i
++, j
++)); do
134 # Append each nonempty word consisting of just
135 # word separator characters to the current word.
139 [ -n "${COMP_WORDS[$i]}" ] &&
140 # word consists of excluded word separators
141 [ "${COMP_WORDS[$i]//[^$exclude]}" = "${COMP_WORDS[$i]}" ]
143 # Attach to the previous token,
144 # unless the previous token is the command name.
145 if [ $j -ge 2 ] && [ -n "$first" ]; then
149 words_
[$j]=${words_[j]}${COMP_WORDS[i]}
150 if [ $i = $COMP_CWORD ]; then
153 if (($i < ${#COMP_WORDS[@]} - 1)); then
160 words_
[$j]=${words_[j]}${COMP_WORDS[i]}
161 if [ $i = $COMP_CWORD ]; then
167 if ! type _get_comp_words_by_ref
>/dev
/null
2>&1; then
168 _get_comp_words_by_ref
()
170 local exclude cur_ words_ cword_
171 if [ "$1" = "-n" ]; then
175 __git_reassemble_comp_words_by_ref
"$exclude"
176 cur_
=${words_[cword_]}
177 while [ $# -gt 0 ]; do
183 prev
=${words_[$cword_-1]}
186 words
=("${words_[@]}")
197 # Generates completion reply with compgen, appending a space to possible
198 # completion words, if necessary.
199 # It accepts 1 to 4 arguments:
200 # 1: List of possible completion words.
201 # 2: A prefix to be added to each possible completion word (optional).
202 # 3: Generate possible completion matches for this word (optional).
203 # 4: A suffix to be appended to each possible completion word (optional).
206 local cur_
="${3-$cur}"
214 COMPREPLY
=($
(compgen
-P "${2-}" \
215 -W "$(__gitcomp_1 "${1-}" "${4-}")" \
221 # Generates completion reply with compgen from newline-separated possible
222 # completion words by appending a space to all of them.
223 # It accepts 1 to 4 arguments:
224 # 1: List of possible completion words, separated by a single newline.
225 # 2: A prefix to be added to each possible completion word (optional).
226 # 3: Generate possible completion matches for this word (optional).
227 # 4: A suffix to be appended to each possible completion word instead of
228 # the default space (optional). If specified but empty, nothing is
233 COMPREPLY
=($
(compgen
-P "${2-}" -S "${4- }" -W "$1" -- "${3-$cur}"))
238 local dir
="$(__gitdir)"
239 if [ -d "$dir" ]; then
240 git
--git-dir="$dir" for-each-ref
--format='%(refname:short)' \
248 local dir
="$(__gitdir)"
249 if [ -d "$dir" ]; then
250 git
--git-dir="$dir" for-each-ref
--format='%(refname:short)' \
256 # __git_refs accepts 0, 1 (to pass to __gitdir), or 2 arguments
257 # presence of 2nd argument means use the guess heuristic employed
258 # by checkout for tracking branches
261 local i
hash dir
="$(__gitdir "${1-}")" track
="${2-}"
263 if [ -d "$dir" ]; then
271 for i
in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD
; do
272 if [ -e "$dir/$i" ]; then echo $i; fi
274 format
="refname:short"
275 refs
="refs/tags refs/heads refs/remotes"
278 git
--git-dir="$dir" for-each-ref
--format="%($format)" \
280 if [ -n "$track" ]; then
281 # employ the heuristic used by git checkout
282 # Try to find a remote branch that matches the completion word
283 # but only output if the branch name is unique
285 git
--git-dir="$dir" for-each-ref
--shell --format="ref=%(refname:short)" \
287 while read -r entry
; do
290 if [[ "$ref" == "$cur"* ]]; then
293 done |
sort |
uniq -u
299 git ls-remote
"$dir" "$cur*" 2>/dev
/null | \
300 while read -r hash i
; do
308 git ls-remote
"$dir" HEAD ORIG_HEAD
'refs/tags/*' 'refs/heads/*' 'refs/remotes/*' 2>/dev
/null | \
309 while read -r hash i
; do
312 refs
/*) echo "${i#refs/*/}" ;;
320 # __git_refs2 requires 1 argument (to pass to __git_refs)
324 for i
in $
(__git_refs
"$1"); do
329 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
330 __git_refs_remotes
()
333 git ls-remote
"$1" 'refs/heads/*' 2>/dev
/null | \
334 while read -r hash i
; do
335 echo "$i:refs/remotes/$1/${i#refs/heads/}"
341 local i IFS
=$
'\n' d
="$(__gitdir)"
342 test -d "$d/remotes" && ls -1 "$d/remotes"
343 for i
in $
(git
--git-dir="$d" config
--get-regexp 'remote\..*\.url' 2>/dev
/null
); do
349 __git_list_merge_strategies
()
351 git merge
-s help 2>&1 |
352 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
361 __git_merge_strategies
=
362 # 'git merge -s help' (and thus detection of the merge strategy
363 # list) fails, unfortunately, if run outside of any git working
364 # tree. __git_merge_strategies is set to the empty string in
365 # that case, and the detection will be repeated the next time it
367 __git_compute_merge_strategies
()
369 test -n "$__git_merge_strategies" ||
370 __git_merge_strategies
=$
(__git_list_merge_strategies
)
373 __git_complete_revlist_file
()
375 local pfx
ls ref cur_
="$cur"
395 case "$COMP_WORDBREAKS" in
397 *) pfx
="$ref:$pfx" ;;
400 __gitcomp_nl
"$(git --git-dir="$
(__gitdir
)" ls-tree "$ls" 2>/dev/null \
401 | sed '/^100... blob /{
417 pfx
="${cur_%...*}..."
419 __gitcomp_nl
"$(__git_refs)" "$pfx" "$cur_"
424 __gitcomp_nl
"$(__git_refs)" "$pfx" "$cur_"
427 __gitcomp_nl
"$(__git_refs)"
433 __git_complete_file
()
435 __git_complete_revlist_file
438 __git_complete_revlist
()
440 __git_complete_revlist_file
443 __git_complete_remote_or_refspec
()
445 local cur_
="$cur" cmd
="${words[1]}"
446 local i c
=2 remote
="" pfx
="" lhs
=1 no_complete_refspec
=0
447 if [ "$cmd" = "remote" ]; then
450 while [ $c -lt $cword ]; do
453 --mirror) [ "$cmd" = "push" ] && no_complete_refspec
=1 ;;
456 push
) no_complete_refspec
=1 ;;
465 *) remote
="$i"; break ;;
469 if [ -z "$remote" ]; then
470 __gitcomp_nl
"$(__git_remotes)"
473 if [ $no_complete_refspec = 1 ]; then
477 [ "$remote" = "." ] && remote
=
480 case "$COMP_WORDBREAKS" in
482 *) pfx
="${cur_%%:*}:" ;;
494 if [ $lhs = 1 ]; then
495 __gitcomp_nl
"$(__git_refs2 "$remote")" "$pfx" "$cur_"
497 __gitcomp_nl
"$(__git_refs)" "$pfx" "$cur_"
501 if [ $lhs = 1 ]; then
502 __gitcomp_nl
"$(__git_refs "$remote")" "$pfx" "$cur_"
504 __gitcomp_nl
"$(__git_refs)" "$pfx" "$cur_"
508 if [ $lhs = 1 ]; then
509 __gitcomp_nl
"$(__git_refs)" "$pfx" "$cur_"
511 __gitcomp_nl
"$(__git_refs "$remote")" "$pfx" "$cur_"
517 __git_complete_strategy
()
519 __git_compute_merge_strategies
522 __gitcomp
"$__git_merge_strategies"
527 __gitcomp
"$__git_merge_strategies" "" "${cur##--strategy=}"
534 __git_list_all_commands
()
537 for i
in $
(git
help -a|
egrep '^ [a-zA-Z0-9]')
540 *--*) : helper pattern
;;
547 __git_compute_all_commands
()
549 test -n "$__git_all_commands" ||
550 __git_all_commands
=$
(__git_list_all_commands
)
553 __git_list_porcelain_commands
()
556 __git_compute_all_commands
557 for i
in $__git_all_commands
560 *--*) : helper pattern
;;
561 applymbox
) : ask gittus
;;
562 applypatch
) : ask gittus
;;
563 archimport
) : import
;;
564 cat-file
) : plumbing
;;
565 check-attr
) : plumbing
;;
566 check-ignore
) : plumbing
;;
567 check-ref-format
) : plumbing
;;
568 checkout-index
) : plumbing
;;
569 commit-tree
) : plumbing
;;
570 count-objects
) : infrequent
;;
571 credential-cache
) : credentials helper
;;
572 credential-store
) : credentials helper
;;
573 cvsexportcommit
) : export;;
574 cvsimport
) : import
;;
575 cvsserver
) : daemon
;;
577 diff-files
) : plumbing
;;
578 diff-index
) : plumbing
;;
579 diff-tree
) : plumbing
;;
580 fast-import
) : import
;;
581 fast-export
) : export;;
582 fsck-objects
) : plumbing
;;
583 fetch-pack
) : plumbing
;;
584 fmt-merge-msg
) : plumbing
;;
585 for-each-ref
) : plumbing
;;
586 hash-object
) : plumbing
;;
587 http-
*) : transport
;;
588 index-pack
) : plumbing
;;
589 init-db
) : deprecated
;;
590 local-fetch
) : plumbing
;;
591 lost-found
) : infrequent
;;
592 ls-files
) : plumbing
;;
593 ls-remote
) : plumbing
;;
594 ls-tree
) : plumbing
;;
595 mailinfo
) : plumbing
;;
596 mailsplit
) : plumbing
;;
597 merge-
*) : plumbing
;;
600 pack-objects
) : plumbing
;;
601 pack-redundant
) : plumbing
;;
602 pack-refs
) : plumbing
;;
603 parse-remote
) : plumbing
;;
604 patch-id
) : plumbing
;;
605 peek-remote
) : plumbing
;;
607 prune-packed
) : plumbing
;;
608 quiltimport
) : import
;;
609 read-tree
) : plumbing
;;
610 receive-pack
) : plumbing
;;
611 remote-
*) : transport
;;
612 repo-config
) : deprecated
;;
614 rev-list
) : plumbing
;;
615 rev-parse
) : plumbing
;;
616 runstatus
) : plumbing
;;
617 sh-setup
) : internal
;;
619 show-ref
) : plumbing
;;
620 send-pack
) : plumbing
;;
621 show-index
) : plumbing
;;
623 stripspace
) : plumbing
;;
624 symbolic-ref
) : plumbing
;;
625 tar-tree
) : deprecated
;;
626 unpack-file
) : plumbing
;;
627 unpack-objects
) : plumbing
;;
628 update-index
) : plumbing
;;
629 update-ref
) : plumbing
;;
630 update-server-info
) : daemon
;;
631 upload-archive
) : plumbing
;;
632 upload-pack
) : plumbing
;;
633 write-tree
) : plumbing
;;
635 verify-pack
) : infrequent
;;
636 verify-tag
) : plumbing
;;
642 __git_porcelain_commands
=
643 __git_compute_porcelain_commands
()
645 __git_compute_all_commands
646 test -n "$__git_porcelain_commands" ||
647 __git_porcelain_commands
=$
(__git_list_porcelain_commands
)
650 __git_pretty_aliases
()
653 for i
in $
(git
--git-dir="$(__gitdir)" config
--get-regexp "pretty\..*" 2>/dev
/null
); do
666 for i
in $
(git
--git-dir="$(__gitdir)" config
--get-regexp "alias\..*" 2>/dev
/null
); do
676 # __git_aliased_command requires 1 argument
677 __git_aliased_command
()
679 local word cmdline
=$
(git
--git-dir="$(__gitdir)" \
680 config
--get "alias.$1")
681 for word
in $cmdline; do
687 \
!*) : shell
command alias ;;
689 *=*) : setting env
;;
698 # __git_find_on_cmdline requires 1 argument
699 __git_find_on_cmdline
()
701 local word subcommand c
=1
702 while [ $c -lt $cword ]; do
704 for subcommand
in $1; do
705 if [ "$subcommand" = "$word" ]; then
714 __git_has_doubledash
()
717 while [ $c -lt $cword ]; do
718 if [ "--" = "${words[c]}" ]; then
726 __git_whitespacelist
="nowarn warn error error-all fix"
730 local dir
="$(__gitdir)"
731 if [ -d "$dir"/rebase-apply
]; then
732 __gitcomp
"--skip --continue --resolved --abort"
737 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
742 --3way --committer-date-is-author-date --ignore-date
743 --ignore-whitespace --ignore-space-change
744 --interactive --keep --no-utf8 --signoff --utf8
745 --whitespace= --scissors
756 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
761 --stat --numstat --summary --check --index
762 --cached --index-info --reverse --reject --unidiff-zero
763 --apply --no-add --exclude=
764 --ignore-whitespace --ignore-space-change
765 --whitespace= --inaccurate-eof --verbose
774 __git_has_doubledash
&& return
779 --interactive --refresh --patch --update --dry-run
780 --ignore-errors --intent-to-add
791 __gitcomp
"$(git archive --list)" "" "${cur##--format=}"
795 __gitcomp_nl
"$(__git_remotes)" "" "${cur##--remote=}"
800 --format= --list --verbose
801 --prefix= --remote= --exec=
811 __git_has_doubledash
&& return
813 local subcommands
="start bad good skip reset visualize replay log run"
814 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
815 if [ -z "$subcommand" ]; then
816 if [ -f "$(__gitdir)"/BISECT_START
]; then
817 __gitcomp
"$subcommands"
819 __gitcomp
"replay start"
824 case "$subcommand" in
825 bad|good|
reset|skip|start
)
826 __gitcomp_nl
"$(__git_refs)"
836 local i c
=1 only_local_ref
="n" has_r
="n"
838 while [ $c -lt $cword ]; do
841 -d|
-m) only_local_ref
="y" ;;
849 __gitcomp
"$(__git_refs)" "" "${cur##--set-upstream-to=}"
853 --color --no-color --verbose --abbrev= --no-abbrev
854 --track --no-track --contains --merged --no-merged
855 --set-upstream-to= --edit-description --list
860 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
861 __gitcomp_nl
"$(__git_heads)"
863 __gitcomp_nl
"$(__git_refs)"
871 local cmd
="${words[2]}"
874 __gitcomp
"create list-heads verify unbundle"
882 __git_complete_revlist
891 __git_has_doubledash
&& return
895 __gitcomp
"diff3 merge" "" "${cur##--conflict=}"
899 --quiet --ours --theirs --track --no-track --merge
900 --conflict= --orphan --patch
904 # check if --track, --no-track, or --no-guess was specified
905 # if so, disable DWIM mode
906 local flags
="--track --no-track --no-guess" track
=1
907 if [ -n "$(__git_find_on_cmdline "$flags")" ]; then
910 __gitcomp_nl
"$(__git_refs '' $track)"
917 __gitcomp
"$(__git_refs)"
924 __gitcomp
"--edit --no-commit"
927 __gitcomp_nl
"$(__git_refs)"
934 __git_has_doubledash
&& return
938 __gitcomp
"--dry-run --quiet"
973 __git_has_doubledash
&& return
977 __gitcomp_nl
"$(__git_refs)" "" "${cur}"
984 __gitcomp
"default strip verbatim whitespace
985 " "" "${cur##--cleanup=}"
988 --reuse-message=*|
--reedit-message=*|\
989 --fixup=*|
--squash=*)
990 __gitcomp_nl
"$(__git_refs)" "" "${cur#*=}"
994 __gitcomp
"all no normal" "" "${cur##--untracked-files=}"
999 --all --author= --signoff --verify --no-verify
1001 --amend --include --only --interactive
1002 --dry-run --reuse-message= --reedit-message=
1003 --reset-author --file= --message= --template=
1004 --cleanup= --untracked-files --untracked-files=
1005 --verbose --quiet --fixup= --squash=
1017 --all --tags --contains --abbrev= --candidates=
1018 --exact-match --debug --long --match --always
1022 __gitcomp_nl
"$(__git_refs)"
1025 __git_diff_common_options
="--stat --numstat --shortstat --summary
1026 --patch-with-stat --name-only --name-status --color
1027 --no-color --color-words --no-renames --check
1028 --full-index --binary --abbrev --diff-filter=
1029 --find-copies-harder
1030 --text --ignore-space-at-eol --ignore-space-change
1031 --ignore-all-space --exit-code --quiet --ext-diff
1033 --no-prefix --src-prefix= --dst-prefix=
1034 --inter-hunk-context=
1037 --dirstat --dirstat= --dirstat-by-file
1038 --dirstat-by-file= --cumulative
1043 __git_has_doubledash
&& return
1047 __gitcomp
"--cached --staged --pickaxe-all --pickaxe-regex
1048 --base --ours --theirs --no-index
1049 $__git_diff_common_options
1054 __git_complete_revlist_file
1057 __git_mergetools_common
="diffuse ecmerge emerge kdiff3 meld opendiff
1058 tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc3 codecompare
1063 __git_has_doubledash
&& return
1067 __gitcomp
"$__git_mergetools_common kompare" "" "${cur##--tool=}"
1071 __gitcomp
"--cached --staged --pickaxe-all --pickaxe-regex
1072 --base --ours --theirs
1073 --no-renames --diff-filter= --find-copies-harder
1074 --relative --ignore-submodules
1082 __git_fetch_options
="
1083 --quiet --verbose --append --upload-pack --force --keep --depth=
1084 --tags --no-tags --all --prune --dry-run
1091 __gitcomp
"$__git_fetch_options"
1095 __git_complete_remote_or_refspec
1098 __git_format_patch_options
="
1099 --stdout --attach --no-attach --thread --thread= --output-directory
1100 --numbered --start-number --numbered-files --keep-subject --signoff
1101 --signature --no-signature --in-reply-to= --cc= --full-index --binary
1102 --not --all --cover-letter --no-prefix --src-prefix= --dst-prefix=
1103 --inline --suffix= --ignore-if-in-upstream --subject-prefix=
1106 _git_format_patch
()
1112 " "" "${cur##--thread=}"
1116 __gitcomp
"$__git_format_patch_options"
1120 __git_complete_revlist
1128 --tags --root --unreachable --cache --no-reflogs --full
1129 --strict --verbose --lost-found
1141 __gitcomp
"--prune --aggressive"
1153 __git_match_ctag
() {
1154 awk "/^${1////\\/}/ { print \$1 }" "$2"
1159 __git_has_doubledash
&& return
1165 --text --ignore-case --word-regexp --invert-match
1166 --full-name --line-number
1167 --extended-regexp --basic-regexp --fixed-strings
1169 --files-with-matches --name-only
1170 --files-without-match
1173 --and --or --not --all-match
1179 case "$cword,$prev" in
1181 if test -r tags
; then
1182 __gitcomp_nl
"$(__git_match_ctag "$cur" tags)"
1188 __gitcomp_nl
"$(__git_refs)"
1195 __gitcomp
"--all --info --man --web"
1199 __git_compute_all_commands
1200 __gitcomp
"$__git_all_commands $(__git_aliases)
1201 attributes cli core-tutorial cvs-migration
1202 diffcore gitk glossary hooks ignore modules
1203 namespaces repository-layout tutorial tutorial-2
1213 false true umask group all world everybody
1214 " "" "${cur##--shared=}"
1218 __gitcomp
"--quiet --bare --template= --shared --shared="
1227 __git_has_doubledash
&& return
1231 __gitcomp
"--cached --deleted --modified --others --ignored
1232 --stage --directory --no-empty-directory --unmerged
1233 --killed --exclude= --exclude-from=
1234 --exclude-per-directory= --exclude-standard
1235 --error-unmatch --with-tree= --full-name
1236 --abbrev --ignored --exclude-per-directory
1246 __gitcomp_nl
"$(__git_remotes)"
1254 # Options that go well for log, shortlog and gitk
1255 __git_log_common_options
="
1257 --branches --tags --remotes
1258 --first-parent --merges --no-merges
1260 --max-age= --since= --after=
1261 --min-age= --until= --before=
1262 --min-parents= --max-parents=
1263 --no-min-parents --no-max-parents
1265 # Options that go well for log and gitk (not shortlog)
1266 __git_log_gitk_options
="
1267 --dense --sparse --full-history
1268 --simplify-merges --simplify-by-decoration
1269 --left-right --notes --no-notes
1271 # Options that go well for log and shortlog (not gitk)
1272 __git_log_shortlog_options
="
1273 --author= --committer= --grep=
1277 __git_log_pretty_formats
="oneline short medium full fuller email raw format:"
1278 __git_log_date_formats
="relative iso8601 rfc2822 short local default raw"
1282 __git_has_doubledash
&& return
1284 local g
="$(git rev-parse --git-dir 2>/dev/null)"
1286 if [ -f "$g/MERGE_HEAD" ]; then
1290 --pretty=*|
--format=*)
1291 __gitcomp
"$__git_log_pretty_formats $(__git_pretty_aliases)
1296 __gitcomp
"$__git_log_date_formats" "" "${cur##--date=}"
1300 __gitcomp
"long short" "" "${cur##--decorate=}"
1305 $__git_log_common_options
1306 $__git_log_shortlog_options
1307 $__git_log_gitk_options
1308 --root --topo-order --date-order --reverse
1309 --follow --full-diff
1310 --abbrev-commit --abbrev=
1311 --relative-date --date=
1312 --pretty= --format= --oneline
1315 --decorate --decorate=
1317 --parents --children
1319 $__git_diff_common_options
1320 --pickaxe-all --pickaxe-regex
1325 __git_complete_revlist
1328 __git_merge_options
="
1329 --no-commit --no-stat --log --no-log --squash --strategy
1330 --commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit
1335 __git_complete_strategy
&& return
1339 __gitcomp
"$__git_merge_options"
1342 __gitcomp_nl
"$(__git_refs)"
1349 __gitcomp
"$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1362 __gitcomp_nl
"$(__git_refs)"
1369 __gitcomp
"--dry-run"
1378 __gitcomp
"--tags --all --stdin"
1383 local subcommands
='add append copy edit list prune remove show'
1384 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1386 case "$subcommand,$cur" in
1393 __gitcomp_nl
"$(__git_refs)"
1396 __gitcomp
"$subcommands --ref"
1400 add
,--reuse-message=*|append
,--reuse-message=*|\
1401 add
,--reedit-message=*|append
,--reedit-message=*)
1402 __gitcomp_nl
"$(__git_refs)" "" "${cur#*=}"
1405 __gitcomp
'--file= --message= --reedit-message=
1412 __gitcomp
'--dry-run --verbose'
1421 __gitcomp_nl
"$(__git_refs)"
1430 __git_complete_strategy
&& return
1435 --rebase --no-rebase
1436 $__git_merge_options
1437 $__git_fetch_options
1442 __git_complete_remote_or_refspec
1449 __gitcomp_nl
"$(__git_remotes)"
1454 __gitcomp_nl
"$(__git_remotes)" "" "${cur##--repo=}"
1459 --all --mirror --tags --dry-run --force --verbose
1460 --receive-pack= --repo= --set-upstream
1465 __git_complete_remote_or_refspec
1470 local dir
="$(__gitdir)"
1471 if [ -d "$dir"/rebase-apply
] ||
[ -d "$dir"/rebase-merge
]; then
1472 __gitcomp
"--continue --skip --abort"
1475 __git_complete_strategy
&& return
1478 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
1483 --onto --merge --strategy --interactive
1484 --preserve-merges --stat --no-stat
1485 --committer-date-is-author-date --ignore-date
1486 --ignore-whitespace --whitespace=
1492 __gitcomp_nl
"$(__git_refs)"
1497 local subcommands
="show delete expire"
1498 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1500 if [ -z "$subcommand" ]; then
1501 __gitcomp
"$subcommands"
1503 __gitcomp_nl
"$(__git_refs)"
1507 __git_send_email_confirm_options
="always never auto cc compose"
1508 __git_send_email_suppresscc_options
="author self cc bodycc sob cccmd body all"
1515 $__git_send_email_confirm_options
1516 " "" "${cur##--confirm=}"
1521 $__git_send_email_suppresscc_options
1522 " "" "${cur##--suppress-cc=}"
1526 --smtp-encryption=*)
1527 __gitcomp
"ssl tls" "" "${cur##--smtp-encryption=}"
1533 " "" "${cur##--thread=}"
1537 __gitcomp
"--annotate --bcc --cc --cc-cmd --chain-reply-to
1538 --compose --confirm= --dry-run --envelope-sender
1540 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1541 --no-suppress-from --no-thread --quiet
1542 --signed-off-by-cc --smtp-pass --smtp-server
1543 --smtp-server-port --smtp-encryption= --smtp-user
1544 --subject --suppress-cc= --suppress-from --thread --to
1545 --validate --no-validate
1546 $__git_format_patch_options"
1550 __git_complete_revlist
1558 __git_config_get_set_variables
()
1560 local prevword word config_file
= c
=$cword
1561 while [ $c -gt 1 ]; do
1564 --global|
--system|
--file=*)
1569 config_file
="$word $prevword"
1577 git
--git-dir="$(__gitdir)" config
$config_file --list 2>/dev
/null |
1592 __gitcomp_nl
"$(__git_remotes)"
1596 __gitcomp_nl
"$(__git_refs)"
1600 local remote
="${prev#remote.}"
1601 remote
="${remote%.fetch}"
1602 if [ -z "$cur" ]; then
1603 COMPREPLY
=("refs/heads/")
1606 __gitcomp_nl
"$(__git_refs_remotes "$remote")"
1610 local remote
="${prev#remote.}"
1611 remote
="${remote%.push}"
1612 __gitcomp_nl
"$(git --git-dir="$
(__gitdir
)" \
1613 for-each-ref --format='%(refname):%(refname)' \
1617 pull.twohead|pull.octopus
)
1618 __git_compute_merge_strategies
1619 __gitcomp
"$__git_merge_strategies"
1622 color.branch|color.
diff|color.interactive|\
1623 color.showbranch|color.status|color.ui
)
1624 __gitcomp
"always never auto"
1628 __gitcomp
"false true"
1633 normal black red green yellow blue magenta cyan white
1634 bold dim ul blink reverse
1639 __gitcomp
"man info web html"
1643 __gitcomp
"$__git_log_date_formats"
1646 sendemail.aliasesfiletype
)
1647 __gitcomp
"mutt mailrc pine elm gnus"
1651 __gitcomp
"$__git_send_email_confirm_options"
1654 sendemail.suppresscc
)
1655 __gitcomp
"$__git_send_email_suppresscc_options"
1658 --get|
--get-all|
--unset|
--unset-all)
1659 __gitcomp_nl
"$(__git_config_get_set_variables)"
1670 --global --system --file=
1671 --list --replace-all
1672 --get --get-all --get-regexp
1673 --add --unset --unset-all
1674 --remove-section --rename-section
1679 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1680 __gitcomp
"remote merge mergeoptions rebase" "$pfx" "$cur_"
1684 local pfx
="${cur%.*}." cur_
="${cur#*.}"
1685 __gitcomp_nl
"$(__git_heads)" "$pfx" "$cur_" "."
1689 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1691 argprompt cmd confirm needsfile noconsole norescan
1692 prompt revprompt revunmerged title
1697 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1698 __gitcomp
"cmd path" "$pfx" "$cur_"
1702 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1703 __gitcomp
"cmd path" "$pfx" "$cur_"
1707 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1708 __gitcomp
"cmd path trustExitCode" "$pfx" "$cur_"
1712 local pfx
="${cur%.*}." cur_
="${cur#*.}"
1713 __git_compute_all_commands
1714 __gitcomp_nl
"$__git_all_commands" "$pfx" "$cur_"
1718 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1720 url proxy fetch push mirror skipDefaultUpdate
1721 receivepack uploadpack tagopt pushurl
1726 local pfx
="${cur%.*}." cur_
="${cur#*.}"
1727 __gitcomp_nl
"$(__git_remotes)" "$pfx" "$cur_" "."
1731 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1732 __gitcomp
"insteadOf pushInsteadOf" "$pfx" "$cur_"
1738 advice.commitBeforeMerge
1740 advice.implicitIdentity
1741 advice.pushNonFastForward
1742 advice.resolveConflict
1746 apply.ignorewhitespace
1748 branch.autosetupmerge
1749 branch.autosetuprebase
1753 color.branch.current
1758 color.decorate.branch
1759 color.decorate.remoteBranch
1760 color.decorate.stash
1770 color.diff.whitespace
1775 color.grep.linenumber
1778 color.grep.separator
1780 color.interactive.error
1781 color.interactive.header
1782 color.interactive.help
1783 color.interactive.prompt
1788 color.status.changed
1790 color.status.nobranch
1791 color.status.untracked
1792 color.status.updated
1801 core.bigFileThreshold
1804 core.deltaBaseCacheLimit
1809 core.fsyncobjectfiles
1811 core.ignoreCygwinFSTricks
1814 core.logAllRefUpdates
1815 core.loosecompression
1818 core.packedGitWindowSize
1820 core.preferSymlinkRefs
1823 core.repositoryFormatVersion
1825 core.sharedRepository
1829 core.warnAmbiguousRefs
1832 diff.autorefreshindex
1835 diff.ignoreSubmodules
1840 diff.suppressBlankEmpty
1845 fetch.recurseSubmodules
1854 format.subjectprefix
1865 gc.reflogexpireunreachable
1869 gitcvs.commitmsgannotation
1870 gitcvs.dbTableNamePrefix
1881 gui.copyblamethreshold
1885 gui.matchtrackingbranch
1886 gui.newbranchtemplate
1887 gui.pruneduringfetch
1888 gui.spellingdictionary
1903 http.sslCertPasswordProtected
1908 i18n.logOutputEncoding
1914 imap.preformattedHTML
1924 interactive.singlekey
1940 mergetool.keepBackup
1941 mergetool.keepTemporaries
1946 notes.rewrite.rebase
1950 pack.deltaCacheLimit
1966 receive.denyCurrentBranch
1967 receive.denyDeleteCurrent
1969 receive.denyNonFastForwards
1972 receive.updateserverinfo
1974 repack.usedeltabaseoffset
1978 sendemail.aliasesfile
1979 sendemail.aliasfiletype
1983 sendemail.chainreplyto
1985 sendemail.envelopesender
1989 sendemail.signedoffbycc
1990 sendemail.smtpdomain
1991 sendemail.smtpencryption
1993 sendemail.smtpserver
1994 sendemail.smtpserveroption
1995 sendemail.smtpserverport
1997 sendemail.suppresscc
1998 sendemail.suppressfrom
2003 status.relativePaths
2004 status.showUntrackedFiles
2005 status.submodulesummary
2008 transfer.unpackLimit
2020 local subcommands
="add rename remove set-head set-branches set-url show prune update"
2021 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
2022 if [ -z "$subcommand" ]; then
2023 __gitcomp
"$subcommands"
2027 case "$subcommand" in
2028 rename|remove|set-url|show|prune
)
2029 __gitcomp_nl
"$(__git_remotes)"
2031 set-head|set-branches
)
2032 __git_complete_remote_or_refspec
2035 local i c
='' IFS
=$
'\n'
2036 for i
in $
(git
--git-dir="$(__gitdir)" config
--get-regexp "remotes\..*" 2>/dev
/null
); do
2050 __gitcomp_nl
"$(__git_refs)"
2055 __git_has_doubledash
&& return
2059 __gitcomp
"--merge --mixed --hard --soft --patch"
2063 __gitcomp_nl
"$(__git_refs)"
2070 __gitcomp
"--edit --mainline --no-edit --no-commit --signoff"
2074 __gitcomp_nl
"$(__git_refs)"
2079 __git_has_doubledash
&& return
2083 __gitcomp
"--cached --dry-run --ignore-unmatch --quiet"
2092 __git_has_doubledash
&& return
2097 $__git_log_common_options
2098 $__git_log_shortlog_options
2099 --numbered --summary
2104 __git_complete_revlist
2109 __git_has_doubledash
&& return
2112 --pretty=*|
--format=*)
2113 __gitcomp
"$__git_log_pretty_formats $(__git_pretty_aliases)
2118 __gitcomp
"--pretty= --format= --abbrev-commit --oneline
2119 $__git_diff_common_options
2132 --all --remotes --topo-order --current --more=
2133 --list --independent --merge-base --no-name
2135 --sha1-name --sparse --topics --reflog
2140 __git_complete_revlist
2145 local save_opts
='--keep-index --no-keep-index --quiet --patch'
2146 local subcommands
='save list show apply clear drop pop create branch'
2147 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
2148 if [ -z "$subcommand" ]; then
2151 __gitcomp
"$save_opts"
2154 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2155 __gitcomp
"$subcommands"
2162 case "$subcommand,$cur" in
2164 __gitcomp
"$save_opts"
2167 __gitcomp
"--index --quiet"
2169 show
,--*|drop
,--*|branch
,--*)
2172 show
,*|apply
,*|drop
,*|pop
,*|branch
,*)
2173 __gitcomp_nl
"$(git --git-dir="$
(__gitdir
)" stash list \
2174 | sed -n -e 's/:.*//p')"
2185 __git_has_doubledash
&& return
2187 local subcommands
="add status init update summary foreach sync"
2188 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2191 __gitcomp
"--quiet --cached"
2194 __gitcomp
"$subcommands"
2204 init fetch clone rebase dcommit log find-rev
2205 set-tree commit-diff info create-ignore propget
2206 proplist show-ignore show-externals branch tag blame
2207 migrate mkdirs reset gc
2209 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
2210 if [ -z "$subcommand" ]; then
2211 __gitcomp
"$subcommands"
2213 local remote_opts
="--username= --config-dir= --no-auth-cache"
2215 --follow-parent --authors-file= --repack=
2216 --no-metadata --use-svm-props --use-svnsync-props
2217 --log-window-size= --no-checkout --quiet
2218 --repack-flags --use-log-author --localtime
2219 --ignore-paths= $remote_opts
2222 --template= --shared= --trunk= --tags=
2223 --branches= --stdlayout --minimize-url
2224 --no-metadata --use-svm-props --use-svnsync-props
2225 --rewrite-root= --prefix= --use-log-author
2226 --add-author-from $remote_opts
2229 --edit --rmdir --find-copies-harder --copy-similarity=
2232 case "$subcommand,$cur" in
2234 __gitcomp
"--revision= --fetch-all $fc_opts"
2237 __gitcomp
"--revision= $fc_opts $init_opts"
2240 __gitcomp
"$init_opts"
2244 --merge --strategy= --verbose --dry-run
2245 --fetch-all --no-rebase --commit-url
2246 --revision --interactive $cmt_opts $fc_opts
2250 __gitcomp
"--stdin $cmt_opts $fc_opts"
2252 create-ignore
,--*|propget
,--*|proplist
,--*|show-ignore
,--*|\
2253 show-externals
,--*|mkdirs
,--*)
2254 __gitcomp
"--revision="
2258 --limit= --revision= --verbose --incremental
2259 --oneline --show-commit --non-recursive
2260 --authors-file= --color
2265 --merge --verbose --strategy= --local
2266 --fetch-all --dry-run $fc_opts
2270 __gitcomp
"--message= --file= --revision= $cmt_opts"
2276 __gitcomp
"--dry-run --message --tag"
2279 __gitcomp
"--dry-run --message"
2282 __gitcomp
"--git-format"
2286 --config-dir= --ignore-paths= --minimize
2287 --no-auth-cache --username=
2291 __gitcomp
"--revision= --parent"
2303 while [ $c -lt $cword ]; do
2307 __gitcomp_nl
"$(__git_tags)"
2323 __gitcomp_nl
"$(__git_tags)"
2329 __gitcomp_nl
"$(__git_refs)"
2341 local i c
=1 command __git_dir
2343 while [ $c -lt $cword ]; do
2346 --git-dir=*) __git_dir
="${i#--git-dir=}" ;;
2347 --bare) __git_dir
="." ;;
2348 --help) command="help"; break ;;
2351 *) command="$i"; break ;;
2356 if [ -z "$command" ]; then
2370 --no-replace-objects
2374 *) __git_compute_porcelain_commands
2375 __gitcomp
"$__git_porcelain_commands $(__git_aliases)" ;;
2380 local completion_func
="_git_${command//-/_}"
2381 declare -f $completion_func >/dev
/null
&& $completion_func && return
2383 local expansion
=$
(__git_aliased_command
"$command")
2384 if [ -n "$expansion" ]; then
2385 completion_func
="_git_${expansion//-/_}"
2386 declare -f $completion_func >/dev
/null
&& $completion_func
2392 __git_has_doubledash
&& return
2394 local g
="$(__gitdir)"
2396 if [ -f "$g/MERGE_HEAD" ]; then
2402 $__git_log_common_options
2403 $__git_log_gitk_options
2409 __git_complete_revlist
2412 if [[ -n ${ZSH_VERSION-} ]]; then
2413 echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
2415 autoload
-U +X compinit
&& compinit
2421 local cur_
="${3-$cur}"
2427 local c IFS
=$
' \t\n'
2438 compadd
-Q -S '' -p "${2-}" -a -- array
&& _ret
=0
2449 compadd
-Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0
2455 local cur cword prev
2456 cur=${words[CURRENT-1]}
2457 prev=${words[CURRENT-2]}
2467 let _ret && _default -S '' && _ret=0
2471 compdef _git git gitk
2477 local cur words cword prev
2478 _get_comp_words_by_ref -n =: cur words cword prev
2482 # Setup completion for certain functions defined above by setting common
2483 # variables and workarounds.
2484 # This is NOT a public function; use at your own risk.
2487 local wrapper="__git_wrap
${2}"
2488 eval "$wrapper () { __git_func_wrap
$2 ; }"
2489 complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \
2490 || complete -o default -o nospace -F $wrapper $1
2493 # wrapper for backwards compatibility
2496 __git_wrap__git_main
2499 # wrapper for backwards compatibility
2502 __git_wrap__gitk_main
2505 __git_complete git __git_main
2506 __git_complete gitk __gitk_main
2508 # The following are necessary only for Cygwin, and only are needed
2509 # when the user has tab-completed the executable name and consequently
2510 # included the '.exe' suffix.
2512 if [ Cygwin = "$
(uname
-o 2>/dev
/null
)" ]; then
2513 __git_complete git.exe __git_main