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
264 COMPREPLY
=($
(compgen
-P "${2-}" -S "${4- }" -W "$1" -- "${3-$cur}"))
269 local dir
="$(__gitdir)"
270 if [ -d "$dir" ]; then
271 git
--git-dir="$dir" for-each-ref
--format='%(refname:short)' \
279 local dir
="$(__gitdir)"
280 if [ -d "$dir" ]; then
281 git
--git-dir="$dir" for-each-ref
--format='%(refname:short)' \
287 # __git_refs accepts 0, 1 (to pass to __gitdir), or 2 arguments
288 # presence of 2nd argument means use the guess heuristic employed
289 # by checkout for tracking branches
292 local i
hash dir
="$(__gitdir "${1-}")" track
="${2-}"
294 if [ -d "$dir" ]; then
302 for i
in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD
; do
303 if [ -e "$dir/$i" ]; then echo $i; fi
305 format
="refname:short"
306 refs
="refs/tags refs/heads refs/remotes"
309 git
--git-dir="$dir" for-each-ref
--format="%($format)" \
311 if [ -n "$track" ]; then
312 # employ the heuristic used by git checkout
313 # Try to find a remote branch that matches the completion word
314 # but only output if the branch name is unique
316 git
--git-dir="$dir" for-each-ref
--shell --format="ref=%(refname:short)" \
318 while read -r entry
; do
321 if [[ "$ref" == "$cur"* ]]; then
330 git ls-remote
"$dir" "$cur*" 2>/dev
/null | \
331 while read -r hash i
; do
339 git ls-remote
"$dir" HEAD ORIG_HEAD
'refs/tags/*' 'refs/heads/*' 'refs/remotes/*' 2>/dev
/null | \
340 while read -r hash i
; do
343 refs
/*) echo "${i#refs/*/}" ;;
351 # __git_refs2 requires 1 argument (to pass to __git_refs)
355 for i
in $
(__git_refs
"$1"); do
360 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
361 __git_refs_remotes
()
364 git ls-remote
"$1" 'refs/heads/*' 2>/dev
/null | \
365 while read -r hash i
; do
366 echo "$i:refs/remotes/$1/${i#refs/heads/}"
372 local i IFS
=$
'\n' d
="$(__gitdir)"
373 test -d "$d/remotes" && ls -1 "$d/remotes"
374 for i
in $
(git
--git-dir="$d" config
--get-regexp 'remote\..*\.url' 2>/dev
/null
); do
380 __git_list_merge_strategies
()
382 git merge
-s help 2>&1 |
383 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
392 __git_merge_strategies
=
393 # 'git merge -s help' (and thus detection of the merge strategy
394 # list) fails, unfortunately, if run outside of any git working
395 # tree. __git_merge_strategies is set to the empty string in
396 # that case, and the detection will be repeated the next time it
398 __git_compute_merge_strategies
()
400 test -n "$__git_merge_strategies" ||
401 __git_merge_strategies
=$
(__git_list_merge_strategies
)
404 __git_complete_revlist_file
()
406 local pfx
ls ref cur_
="$cur"
426 case "$COMP_WORDBREAKS" in
428 *) pfx
="$ref:$pfx" ;;
431 __gitcomp_nl
"$(git --git-dir="$
(__gitdir
)" ls-tree "$ls" \
432 | sed '/^100... blob /{
448 pfx
="${cur_%...*}..."
450 __gitcomp_nl
"$(__git_refs)" "$pfx" "$cur_"
455 __gitcomp_nl
"$(__git_refs)" "$pfx" "$cur_"
458 __gitcomp_nl
"$(__git_refs)"
464 __git_complete_file
()
466 __git_complete_revlist_file
469 __git_complete_revlist
()
471 __git_complete_revlist_file
474 __git_complete_remote_or_refspec
()
476 local cur_
="$cur" cmd
="${words[1]}"
477 local i c
=2 remote
="" pfx
="" lhs
=1 no_complete_refspec
=0
478 if [ "$cmd" = "remote" ]; then
481 while [ $c -lt $cword ]; do
484 --mirror) [ "$cmd" = "push" ] && no_complete_refspec
=1 ;;
487 push
) no_complete_refspec
=1 ;;
496 *) remote
="$i"; break ;;
500 if [ -z "$remote" ]; then
501 __gitcomp_nl
"$(__git_remotes)"
504 if [ $no_complete_refspec = 1 ]; then
508 [ "$remote" = "." ] && remote
=
511 case "$COMP_WORDBREAKS" in
513 *) pfx
="${cur_%%:*}:" ;;
525 if [ $lhs = 1 ]; then
526 __gitcomp_nl
"$(__git_refs2 "$remote")" "$pfx" "$cur_"
528 __gitcomp_nl
"$(__git_refs)" "$pfx" "$cur_"
532 if [ $lhs = 1 ]; then
533 __gitcomp_nl
"$(__git_refs "$remote")" "$pfx" "$cur_"
535 __gitcomp_nl
"$(__git_refs)" "$pfx" "$cur_"
539 if [ $lhs = 1 ]; then
540 __gitcomp_nl
"$(__git_refs)" "$pfx" "$cur_"
542 __gitcomp_nl
"$(__git_refs "$remote")" "$pfx" "$cur_"
548 __git_complete_strategy
()
550 __git_compute_merge_strategies
553 __gitcomp
"$__git_merge_strategies"
558 __gitcomp
"$__git_merge_strategies" "" "${cur##--strategy=}"
565 __git_list_all_commands
()
568 for i
in $
(git
help -a|
egrep '^ [a-zA-Z0-9]')
571 *--*) : helper pattern
;;
578 __git_compute_all_commands
()
580 test -n "$__git_all_commands" ||
581 __git_all_commands
=$
(__git_list_all_commands
)
584 __git_list_porcelain_commands
()
587 __git_compute_all_commands
588 for i
in "help" $__git_all_commands
591 *--*) : helper pattern
;;
592 applymbox
) : ask gittus
;;
593 applypatch
) : ask gittus
;;
594 archimport
) : import
;;
595 cat-file
) : plumbing
;;
596 check-attr
) : plumbing
;;
597 check-ref-format
) : plumbing
;;
598 checkout-index
) : plumbing
;;
599 commit-tree
) : plumbing
;;
600 count-objects
) : infrequent
;;
601 credential-cache
) : credentials helper
;;
602 credential-store
) : credentials helper
;;
603 cvsexportcommit
) : export;;
604 cvsimport
) : import
;;
605 cvsserver
) : daemon
;;
607 diff-files
) : plumbing
;;
608 diff-index
) : plumbing
;;
609 diff-tree
) : plumbing
;;
610 fast-import
) : import
;;
611 fast-export
) : export;;
612 fsck-objects
) : plumbing
;;
613 fetch-pack
) : plumbing
;;
614 fmt-merge-msg
) : plumbing
;;
615 for-each-ref
) : plumbing
;;
616 hash-object
) : plumbing
;;
617 http-
*) : transport
;;
618 index-pack
) : plumbing
;;
619 init-db
) : deprecated
;;
620 local-fetch
) : plumbing
;;
621 lost-found
) : infrequent
;;
622 ls-files
) : plumbing
;;
623 ls-remote
) : plumbing
;;
624 ls-tree
) : plumbing
;;
625 mailinfo
) : plumbing
;;
626 mailsplit
) : plumbing
;;
627 merge-
*) : plumbing
;;
630 pack-objects
) : plumbing
;;
631 pack-redundant
) : plumbing
;;
632 pack-refs
) : plumbing
;;
633 parse-remote
) : plumbing
;;
634 patch-id
) : plumbing
;;
635 peek-remote
) : plumbing
;;
637 prune-packed
) : plumbing
;;
638 quiltimport
) : import
;;
639 read-tree
) : plumbing
;;
640 receive-pack
) : plumbing
;;
641 remote-
*) : transport
;;
642 repo-config
) : deprecated
;;
644 rev-list
) : plumbing
;;
645 rev-parse
) : plumbing
;;
646 runstatus
) : plumbing
;;
647 sh-setup
) : internal
;;
649 show-ref
) : plumbing
;;
650 send-pack
) : plumbing
;;
651 show-index
) : plumbing
;;
653 stripspace
) : plumbing
;;
654 symbolic-ref
) : plumbing
;;
655 tar-tree
) : deprecated
;;
656 unpack-file
) : plumbing
;;
657 unpack-objects
) : plumbing
;;
658 update-index
) : plumbing
;;
659 update-ref
) : plumbing
;;
660 update-server-info
) : daemon
;;
661 upload-archive
) : plumbing
;;
662 upload-pack
) : plumbing
;;
663 write-tree
) : plumbing
;;
665 verify-pack
) : infrequent
;;
666 verify-tag
) : plumbing
;;
672 __git_porcelain_commands
=
673 __git_compute_porcelain_commands
()
675 __git_compute_all_commands
676 test -n "$__git_porcelain_commands" ||
677 __git_porcelain_commands
=$
(__git_list_porcelain_commands
)
680 __git_pretty_aliases
()
683 for i
in $
(git
--git-dir="$(__gitdir)" config
--get-regexp "pretty\..*" 2>/dev
/null
); do
696 for i
in $
(git
--git-dir="$(__gitdir)" config
--get-regexp "alias\..*" 2>/dev
/null
); do
706 # __git_aliased_command requires 1 argument
707 __git_aliased_command
()
709 local word cmdline
=$
(git
--git-dir="$(__gitdir)" \
710 config
--get "alias.$1")
711 for word
in $cmdline; do
717 \
!*) : shell
command alias ;;
719 *=*) : setting env
;;
728 # __git_find_on_cmdline requires 1 argument
729 __git_find_on_cmdline
()
731 local word subcommand c
=1
732 while [ $c -lt $cword ]; do
734 for subcommand
in $1; do
735 if [ "$subcommand" = "$word" ]; then
744 __git_has_doubledash
()
747 while [ $c -lt $cword ]; do
748 if [ "--" = "${words[c]}" ]; then
756 __git_whitespacelist
="nowarn warn error error-all fix"
760 local dir
="$(__gitdir)"
761 if [ -d "$dir"/rebase-apply
]; then
762 __gitcomp
"--skip --continue --resolved --abort"
767 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
772 --3way --committer-date-is-author-date --ignore-date
773 --ignore-whitespace --ignore-space-change
774 --interactive --keep --no-utf8 --signoff --utf8
775 --whitespace= --scissors
786 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
791 --stat --numstat --summary --check --index
792 --cached --index-info --reverse --reject --unidiff-zero
793 --apply --no-add --exclude=
794 --ignore-whitespace --ignore-space-change
795 --whitespace= --inaccurate-eof --verbose
804 __git_has_doubledash
&& return
809 --interactive --refresh --patch --update --dry-run
810 --ignore-errors --intent-to-add
821 __gitcomp
"$(git archive --list)" "" "${cur##--format=}"
825 __gitcomp_nl
"$(__git_remotes)" "" "${cur##--remote=}"
830 --format= --list --verbose
831 --prefix= --remote= --exec=
841 __git_has_doubledash
&& return
843 local subcommands
="start bad good skip reset visualize replay log run"
844 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
845 if [ -z "$subcommand" ]; then
846 if [ -f "$(__gitdir)"/BISECT_START
]; then
847 __gitcomp
"$subcommands"
849 __gitcomp
"replay start"
854 case "$subcommand" in
855 bad|good|
reset|skip|start
)
856 __gitcomp_nl
"$(__git_refs)"
866 local i c
=1 only_local_ref
="n" has_r
="n"
868 while [ $c -lt $cword ]; do
871 -d|
-m) only_local_ref
="y" ;;
880 --color --no-color --verbose --abbrev= --no-abbrev
881 --track --no-track --contains --merged --no-merged
882 --set-upstream --edit-description --list
886 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
887 __gitcomp_nl
"$(__git_heads)"
889 __gitcomp_nl
"$(__git_refs)"
897 local cmd
="${words[2]}"
900 __gitcomp
"create list-heads verify unbundle"
908 __git_complete_revlist
917 __git_has_doubledash
&& return
921 __gitcomp
"diff3 merge" "" "${cur##--conflict=}"
925 --quiet --ours --theirs --track --no-track --merge
926 --conflict= --orphan --patch
930 # check if --track, --no-track, or --no-guess was specified
931 # if so, disable DWIM mode
932 local flags
="--track --no-track --no-guess" track
=1
933 if [ -n "$(__git_find_on_cmdline "$flags")" ]; then
936 __gitcomp_nl
"$(__git_refs '' $track)"
943 __gitcomp
"$(__git_refs)"
950 __gitcomp
"--edit --no-commit"
953 __gitcomp_nl
"$(__git_refs)"
960 __git_has_doubledash
&& return
964 __gitcomp
"--dry-run --quiet"
997 __git_has_doubledash
&& return
1001 __gitcomp
"default strip verbatim whitespace
1002 " "" "${cur##--cleanup=}"
1005 --reuse-message=*|
--reedit-message=*|\
1006 --fixup=*|
--squash=*)
1007 __gitcomp_nl
"$(__git_refs)" "" "${cur#*=}"
1010 --untracked-files=*)
1011 __gitcomp
"all no normal" "" "${cur##--untracked-files=}"
1016 --all --author= --signoff --verify --no-verify
1017 --edit --amend --include --only --interactive
1018 --dry-run --reuse-message= --reedit-message=
1019 --reset-author --file= --message= --template=
1020 --cleanup= --untracked-files --untracked-files=
1021 --verbose --quiet --fixup= --squash=
1033 --all --tags --contains --abbrev= --candidates=
1034 --exact-match --debug --long --match --always
1038 __gitcomp_nl
"$(__git_refs)"
1041 __git_diff_common_options
="--stat --numstat --shortstat --summary
1042 --patch-with-stat --name-only --name-status --color
1043 --no-color --color-words --no-renames --check
1044 --full-index --binary --abbrev --diff-filter=
1045 --find-copies-harder
1046 --text --ignore-space-at-eol --ignore-space-change
1047 --ignore-all-space --exit-code --quiet --ext-diff
1049 --no-prefix --src-prefix= --dst-prefix=
1050 --inter-hunk-context=
1053 --dirstat --dirstat= --dirstat-by-file
1054 --dirstat-by-file= --cumulative
1059 __git_has_doubledash
&& return
1063 __gitcomp
"--cached --staged --pickaxe-all --pickaxe-regex
1064 --base --ours --theirs --no-index
1065 $__git_diff_common_options
1070 __git_complete_revlist_file
1073 __git_mergetools_common
="diffuse ecmerge emerge kdiff3 meld opendiff
1074 tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc3 codecompare
1079 __git_has_doubledash
&& return
1083 __gitcomp
"$__git_mergetools_common kompare" "" "${cur##--tool=}"
1087 __gitcomp
"--cached --staged --pickaxe-all --pickaxe-regex
1088 --base --ours --theirs
1089 --no-renames --diff-filter= --find-copies-harder
1090 --relative --ignore-submodules
1098 __git_fetch_options
="
1099 --quiet --verbose --append --upload-pack --force --keep --depth=
1100 --tags --no-tags --all --prune --dry-run
1107 __gitcomp
"$__git_fetch_options"
1111 __git_complete_remote_or_refspec
1114 _git_format_patch
()
1120 " "" "${cur##--thread=}"
1125 --stdout --attach --no-attach --thread --thread=
1127 --numbered --start-number
1130 --signoff --signature --no-signature
1131 --in-reply-to= --cc=
1132 --full-index --binary
1135 --no-prefix --src-prefix= --dst-prefix=
1136 --inline --suffix= --ignore-if-in-upstream
1142 __git_complete_revlist
1150 --tags --root --unreachable --cache --no-reflogs --full
1151 --strict --verbose --lost-found
1163 __gitcomp
"--prune --aggressive"
1175 __git_match_ctag
() {
1176 awk "/^${1////\\/}/ { print \$1 }" "$2"
1181 __git_has_doubledash
&& return
1187 --text --ignore-case --word-regexp --invert-match
1188 --full-name --line-number
1189 --extended-regexp --basic-regexp --fixed-strings
1191 --files-with-matches --name-only
1192 --files-without-match
1195 --and --or --not --all-match
1201 case "$cword,$prev" in
1203 if test -r tags
; then
1204 __gitcomp_nl
"$(__git_match_ctag "$cur" tags)"
1210 __gitcomp_nl
"$(__git_refs)"
1217 __gitcomp
"--all --info --man --web"
1221 __git_compute_all_commands
1222 __gitcomp
"$__git_all_commands $(__git_aliases)
1223 attributes cli core-tutorial cvs-migration
1224 diffcore gitk glossary hooks ignore modules
1225 namespaces repository-layout tutorial tutorial-2
1235 false true umask group all world everybody
1236 " "" "${cur##--shared=}"
1240 __gitcomp
"--quiet --bare --template= --shared --shared="
1249 __git_has_doubledash
&& return
1253 __gitcomp
"--cached --deleted --modified --others --ignored
1254 --stage --directory --no-empty-directory --unmerged
1255 --killed --exclude= --exclude-from=
1256 --exclude-per-directory= --exclude-standard
1257 --error-unmatch --with-tree= --full-name
1258 --abbrev --ignored --exclude-per-directory
1268 __gitcomp_nl
"$(__git_remotes)"
1276 # Options that go well for log, shortlog and gitk
1277 __git_log_common_options
="
1279 --branches --tags --remotes
1280 --first-parent --merges --no-merges
1282 --max-age= --since= --after=
1283 --min-age= --until= --before=
1284 --min-parents= --max-parents=
1285 --no-min-parents --no-max-parents
1287 # Options that go well for log and gitk (not shortlog)
1288 __git_log_gitk_options
="
1289 --dense --sparse --full-history
1290 --simplify-merges --simplify-by-decoration
1291 --left-right --notes --no-notes
1293 # Options that go well for log and shortlog (not gitk)
1294 __git_log_shortlog_options
="
1295 --author= --committer= --grep=
1299 __git_log_pretty_formats
="oneline short medium full fuller email raw format:"
1300 __git_log_date_formats
="relative iso8601 rfc2822 short local default raw"
1304 __git_has_doubledash
&& return
1306 local g
="$(git rev-parse --git-dir 2>/dev/null)"
1308 if [ -f "$g/MERGE_HEAD" ]; then
1312 --pretty=*|
--format=*)
1313 __gitcomp
"$__git_log_pretty_formats $(__git_pretty_aliases)
1318 __gitcomp
"$__git_log_date_formats" "" "${cur##--date=}"
1322 __gitcomp
"long short" "" "${cur##--decorate=}"
1327 $__git_log_common_options
1328 $__git_log_shortlog_options
1329 $__git_log_gitk_options
1330 --root --topo-order --date-order --reverse
1331 --follow --full-diff
1332 --abbrev-commit --abbrev=
1333 --relative-date --date=
1334 --pretty= --format= --oneline
1337 --decorate --decorate=
1339 --parents --children
1341 $__git_diff_common_options
1342 --pickaxe-all --pickaxe-regex
1347 __git_complete_revlist
1350 __git_merge_options
="
1351 --no-commit --no-stat --log --no-log --squash --strategy
1352 --commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit
1357 __git_complete_strategy
&& return
1361 __gitcomp
"$__git_merge_options"
1364 __gitcomp_nl
"$(__git_refs)"
1371 __gitcomp
"$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1384 __gitcomp_nl
"$(__git_refs)"
1391 __gitcomp
"--dry-run"
1400 __gitcomp
"--tags --all --stdin"
1405 local subcommands
='add append copy edit list prune remove show'
1406 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1408 case "$subcommand,$cur" in
1415 __gitcomp_nl
"$(__git_refs)"
1418 __gitcomp
"$subcommands --ref"
1422 add
,--reuse-message=*|append
,--reuse-message=*|\
1423 add
,--reedit-message=*|append
,--reedit-message=*)
1424 __gitcomp_nl
"$(__git_refs)" "" "${cur#*=}"
1427 __gitcomp
'--file= --message= --reedit-message=
1434 __gitcomp
'--dry-run --verbose'
1443 __gitcomp_nl
"$(__git_refs)"
1452 __git_complete_strategy
&& return
1457 --rebase --no-rebase
1458 $__git_merge_options
1459 $__git_fetch_options
1464 __git_complete_remote_or_refspec
1471 __gitcomp_nl
"$(__git_remotes)"
1476 __gitcomp_nl
"$(__git_remotes)" "" "${cur##--repo=}"
1481 --all --mirror --tags --dry-run --force --verbose
1482 --receive-pack= --repo= --set-upstream
1487 __git_complete_remote_or_refspec
1492 local dir
="$(__gitdir)"
1493 if [ -d "$dir"/rebase-apply
] ||
[ -d "$dir"/rebase-merge
]; then
1494 __gitcomp
"--continue --skip --abort"
1497 __git_complete_strategy
&& return
1500 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
1505 --onto --merge --strategy --interactive
1506 --preserve-merges --stat --no-stat
1507 --committer-date-is-author-date --ignore-date
1508 --ignore-whitespace --whitespace=
1514 __gitcomp_nl
"$(__git_refs)"
1519 local subcommands
="show delete expire"
1520 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1522 if [ -z "$subcommand" ]; then
1523 __gitcomp
"$subcommands"
1525 __gitcomp_nl
"$(__git_refs)"
1529 __git_send_email_confirm_options
="always never auto cc compose"
1530 __git_send_email_suppresscc_options
="author self cc bodycc sob cccmd body all"
1537 $__git_send_email_confirm_options
1538 " "" "${cur##--confirm=}"
1543 $__git_send_email_suppresscc_options
1544 " "" "${cur##--suppress-cc=}"
1548 --smtp-encryption=*)
1549 __gitcomp
"ssl tls" "" "${cur##--smtp-encryption=}"
1553 __gitcomp
"--annotate --bcc --cc --cc-cmd --chain-reply-to
1554 --compose --confirm= --dry-run --envelope-sender
1556 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1557 --no-suppress-from --no-thread --quiet
1558 --signed-off-by-cc --smtp-pass --smtp-server
1559 --smtp-server-port --smtp-encryption= --smtp-user
1560 --subject --suppress-cc= --suppress-from --thread --to
1561 --validate --no-validate"
1573 __git_config_get_set_variables
()
1575 local prevword word config_file
= c
=$cword
1576 while [ $c -gt 1 ]; do
1579 --global|
--system|
--file=*)
1584 config_file
="$word $prevword"
1592 git
--git-dir="$(__gitdir)" config
$config_file --list 2>/dev
/null |
1607 __gitcomp_nl
"$(__git_remotes)"
1611 __gitcomp_nl
"$(__git_refs)"
1615 local remote
="${prev#remote.}"
1616 remote
="${remote%.fetch}"
1617 if [ -z "$cur" ]; then
1618 COMPREPLY
=("refs/heads/")
1621 __gitcomp_nl
"$(__git_refs_remotes "$remote")"
1625 local remote
="${prev#remote.}"
1626 remote
="${remote%.push}"
1627 __gitcomp_nl
"$(git --git-dir="$
(__gitdir
)" \
1628 for-each-ref --format='%(refname):%(refname)' \
1632 pull.twohead|pull.octopus
)
1633 __git_compute_merge_strategies
1634 __gitcomp
"$__git_merge_strategies"
1637 color.branch|color.
diff|color.interactive|\
1638 color.showbranch|color.status|color.ui
)
1639 __gitcomp
"always never auto"
1643 __gitcomp
"false true"
1648 normal black red green yellow blue magenta cyan white
1649 bold dim ul blink reverse
1654 __gitcomp
"man info web html"
1658 __gitcomp
"$__git_log_date_formats"
1661 sendemail.aliasesfiletype
)
1662 __gitcomp
"mutt mailrc pine elm gnus"
1666 __gitcomp
"$__git_send_email_confirm_options"
1669 sendemail.suppresscc
)
1670 __gitcomp
"$__git_send_email_suppresscc_options"
1673 --get|
--get-all|
--unset|
--unset-all)
1674 __gitcomp_nl
"$(__git_config_get_set_variables)"
1685 --global --system --file=
1686 --list --replace-all
1687 --get --get-all --get-regexp
1688 --add --unset --unset-all
1689 --remove-section --rename-section
1694 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1695 __gitcomp
"remote merge mergeoptions rebase" "$pfx" "$cur_"
1699 local pfx
="${cur%.*}." cur_
="${cur#*.}"
1700 __gitcomp_nl
"$(__git_heads)" "$pfx" "$cur_" "."
1704 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1706 argprompt cmd confirm needsfile noconsole norescan
1707 prompt revprompt revunmerged title
1712 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1713 __gitcomp
"cmd path" "$pfx" "$cur_"
1717 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1718 __gitcomp
"cmd path" "$pfx" "$cur_"
1722 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1723 __gitcomp
"cmd path trustExitCode" "$pfx" "$cur_"
1727 local pfx
="${cur%.*}." cur_
="${cur#*.}"
1728 __git_compute_all_commands
1729 __gitcomp_nl
"$__git_all_commands" "$pfx" "$cur_"
1733 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1735 url proxy fetch push mirror skipDefaultUpdate
1736 receivepack uploadpack tagopt pushurl
1741 local pfx
="${cur%.*}." cur_
="${cur#*.}"
1742 __gitcomp_nl
"$(__git_remotes)" "$pfx" "$cur_" "."
1746 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1747 __gitcomp
"insteadOf pushInsteadOf" "$pfx" "$cur_"
1753 advice.commitBeforeMerge
1755 advice.implicitIdentity
1756 advice.pushNonFastForward
1757 advice.resolveConflict
1761 apply.ignorewhitespace
1763 branch.autosetupmerge
1764 branch.autosetuprebase
1768 color.branch.current
1773 color.decorate.branch
1774 color.decorate.remoteBranch
1775 color.decorate.stash
1785 color.diff.whitespace
1790 color.grep.linenumber
1793 color.grep.separator
1795 color.interactive.error
1796 color.interactive.header
1797 color.interactive.help
1798 color.interactive.prompt
1803 color.status.changed
1805 color.status.nobranch
1806 color.status.untracked
1807 color.status.updated
1816 core.bigFileThreshold
1819 core.deltaBaseCacheLimit
1824 core.fsyncobjectfiles
1826 core.ignoreCygwinFSTricks
1829 core.logAllRefUpdates
1830 core.loosecompression
1833 core.packedGitWindowSize
1835 core.preferSymlinkRefs
1838 core.repositoryFormatVersion
1840 core.sharedRepository
1844 core.warnAmbiguousRefs
1847 diff.autorefreshindex
1850 diff.ignoreSubmodules
1855 diff.suppressBlankEmpty
1860 fetch.recurseSubmodules
1869 format.subjectprefix
1880 gc.reflogexpireunreachable
1884 gitcvs.commitmsgannotation
1885 gitcvs.dbTableNamePrefix
1896 gui.copyblamethreshold
1900 gui.matchtrackingbranch
1901 gui.newbranchtemplate
1902 gui.pruneduringfetch
1903 gui.spellingdictionary
1918 http.sslCertPasswordProtected
1923 i18n.logOutputEncoding
1929 imap.preformattedHTML
1939 interactive.singlekey
1955 mergetool.keepBackup
1956 mergetool.keepTemporaries
1961 notes.rewrite.rebase
1965 pack.deltaCacheLimit
1981 receive.denyCurrentBranch
1982 receive.denyDeleteCurrent
1984 receive.denyNonFastForwards
1987 receive.updateserverinfo
1989 repack.usedeltabaseoffset
1993 sendemail.aliasesfile
1994 sendemail.aliasfiletype
1998 sendemail.chainreplyto
2000 sendemail.envelopesender
2004 sendemail.signedoffbycc
2005 sendemail.smtpdomain
2006 sendemail.smtpencryption
2008 sendemail.smtpserver
2009 sendemail.smtpserveroption
2010 sendemail.smtpserverport
2012 sendemail.suppresscc
2013 sendemail.suppressfrom
2018 status.relativePaths
2019 status.showUntrackedFiles
2020 status.submodulesummary
2023 transfer.unpackLimit
2035 local subcommands
="add rename rm set-head set-branches set-url show prune update"
2036 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
2037 if [ -z "$subcommand" ]; then
2038 __gitcomp
"$subcommands"
2042 case "$subcommand" in
2043 rename|
rm|set-url|show|prune
)
2044 __gitcomp_nl
"$(__git_remotes)"
2046 set-head|set-branches
)
2047 __git_complete_remote_or_refspec
2050 local i c
='' IFS
=$
'\n'
2051 for i
in $
(git
--git-dir="$(__gitdir)" config
--get-regexp "remotes\..*" 2>/dev
/null
); do
2065 __gitcomp_nl
"$(__git_refs)"
2070 __git_has_doubledash
&& return
2074 __gitcomp
"--merge --mixed --hard --soft --patch"
2078 __gitcomp_nl
"$(__git_refs)"
2085 __gitcomp
"--edit --mainline --no-edit --no-commit --signoff"
2089 __gitcomp_nl
"$(__git_refs)"
2094 __git_has_doubledash
&& return
2098 __gitcomp
"--cached --dry-run --ignore-unmatch --quiet"
2107 __git_has_doubledash
&& return
2112 $__git_log_common_options
2113 $__git_log_shortlog_options
2114 --numbered --summary
2119 __git_complete_revlist
2124 __git_has_doubledash
&& return
2127 --pretty=*|
--format=*)
2128 __gitcomp
"$__git_log_pretty_formats $(__git_pretty_aliases)
2133 __gitcomp
"--pretty= --format= --abbrev-commit --oneline
2134 $__git_diff_common_options
2147 --all --remotes --topo-order --current --more=
2148 --list --independent --merge-base --no-name
2150 --sha1-name --sparse --topics --reflog
2155 __git_complete_revlist
2160 local save_opts
='--keep-index --no-keep-index --quiet --patch'
2161 local subcommands
='save list show apply clear drop pop create branch'
2162 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
2163 if [ -z "$subcommand" ]; then
2166 __gitcomp
"$save_opts"
2169 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2170 __gitcomp
"$subcommands"
2177 case "$subcommand,$cur" in
2179 __gitcomp
"$save_opts"
2182 __gitcomp
"--index --quiet"
2184 show
,--*|drop
,--*|branch
,--*)
2187 show
,*|apply
,*|drop
,*|pop
,*|branch
,*)
2188 __gitcomp_nl
"$(git --git-dir="$
(__gitdir
)" stash list \
2189 | sed -n -e 's/:.*//p')"
2200 __git_has_doubledash
&& return
2202 local subcommands
="add status init update summary foreach sync"
2203 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2206 __gitcomp
"--quiet --cached"
2209 __gitcomp
"$subcommands"
2219 init fetch clone rebase dcommit log find-rev
2220 set-tree commit-diff info create-ignore propget
2221 proplist show-ignore show-externals branch tag blame
2222 migrate mkdirs reset gc
2224 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
2225 if [ -z "$subcommand" ]; then
2226 __gitcomp
"$subcommands"
2228 local remote_opts
="--username= --config-dir= --no-auth-cache"
2230 --follow-parent --authors-file= --repack=
2231 --no-metadata --use-svm-props --use-svnsync-props
2232 --log-window-size= --no-checkout --quiet
2233 --repack-flags --use-log-author --localtime
2234 --ignore-paths= $remote_opts
2237 --template= --shared= --trunk= --tags=
2238 --branches= --stdlayout --minimize-url
2239 --no-metadata --use-svm-props --use-svnsync-props
2240 --rewrite-root= --prefix= --use-log-author
2241 --add-author-from $remote_opts
2244 --edit --rmdir --find-copies-harder --copy-similarity=
2247 case "$subcommand,$cur" in
2249 __gitcomp
"--revision= --fetch-all $fc_opts"
2252 __gitcomp
"--revision= $fc_opts $init_opts"
2255 __gitcomp
"$init_opts"
2259 --merge --strategy= --verbose --dry-run
2260 --fetch-all --no-rebase --commit-url
2261 --revision --interactive $cmt_opts $fc_opts
2265 __gitcomp
"--stdin $cmt_opts $fc_opts"
2267 create-ignore
,--*|propget
,--*|proplist
,--*|show-ignore
,--*|\
2268 show-externals
,--*|mkdirs
,--*)
2269 __gitcomp
"--revision="
2273 --limit= --revision= --verbose --incremental
2274 --oneline --show-commit --non-recursive
2275 --authors-file= --color
2280 --merge --verbose --strategy= --local
2281 --fetch-all --dry-run $fc_opts
2285 __gitcomp
"--message= --file= --revision= $cmt_opts"
2291 __gitcomp
"--dry-run --message --tag"
2294 __gitcomp
"--dry-run --message"
2297 __gitcomp
"--git-format"
2301 --config-dir= --ignore-paths= --minimize
2302 --no-auth-cache --username=
2306 __gitcomp
"--revision= --parent"
2318 while [ $c -lt $cword ]; do
2322 __gitcomp_nl
"$(__git_tags)"
2338 __gitcomp_nl
"$(__git_tags)"
2344 __gitcomp_nl
"$(__git_refs)"
2356 local i c
=1 command __git_dir
2358 while [ $c -lt $cword ]; do
2361 --git-dir=*) __git_dir
="${i#--git-dir=}" ;;
2362 --bare) __git_dir
="." ;;
2363 --help) command="help"; break ;;
2366 *) command="$i"; break ;;
2371 if [ -z "$command" ]; then
2385 --no-replace-objects
2389 *) __git_compute_porcelain_commands
2390 __gitcomp
"$__git_porcelain_commands $(__git_aliases)" ;;
2395 local completion_func
="_git_${command//-/_}"
2396 declare -f $completion_func >/dev
/null
&& $completion_func && return
2398 local expansion
=$
(__git_aliased_command
"$command")
2399 if [ -n "$expansion" ]; then
2400 completion_func
="_git_${expansion//-/_}"
2401 declare -f $completion_func >/dev
/null
&& $completion_func
2407 __git_has_doubledash
&& return
2409 local g
="$(__gitdir)"
2411 if [ -f "$g/MERGE_HEAD" ]; then
2417 $__git_log_common_options
2418 $__git_log_gitk_options
2424 __git_complete_revlist
2429 if [[ -n ${ZSH_VERSION-} ]]; then
2433 # workaround zsh's bug that leaves 'words' as a special
2434 # variable in versions < 4.3.12
2437 # workaround zsh's bug that quotes spaces in the COMPREPLY
2438 # array if IFS doesn't contain spaces.
2441 local cur words cword prev
2442 _get_comp_words_by_ref
-n =: cur words cword prev
2446 # Setup completion for certain functions defined above by setting common
2447 # variables and workarounds.
2448 # This is NOT a public function; use at your own risk.
2451 local wrapper
="__git_wrap${2}"
2452 eval "$wrapper () { __git_func_wrap $2 ; }"
2453 complete
-o bashdefault
-o default
-o nospace
-F $wrapper $1 2>/dev
/null \
2454 || complete
-o default
-o nospace
-F $wrapper $1
2457 # wrapper for backwards compatibility
2460 __git_wrap__git_main
2463 # wrapper for backwards compatibility
2466 __git_wrap__gitk_main
2469 __git_complete git __git_main
2470 __git_complete gitk __gitk_main
2472 # The following are necessary only for Cygwin, and only are needed
2473 # when the user has tab-completed the executable name and consequently
2474 # included the '.exe' suffix.
2476 if [ Cygwin
= "$(uname -o 2>/dev/null)" ]; then
2477 __git_complete git.exe __git_main