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=}"
535 if test -n "${GIT_TESTING_COMMAND_COMPLETION:-}"
537 printf "%s" "${GIT_TESTING_COMMAND_COMPLETION}"
539 git
help -a|
egrep '^ [a-zA-Z0-9]'
543 __git_list_all_commands
()
546 for i
in $
(__git_commands
)
549 *--*) : helper pattern
;;
556 __git_compute_all_commands
()
558 test -n "$__git_all_commands" ||
559 __git_all_commands
=$
(__git_list_all_commands
)
562 __git_list_porcelain_commands
()
565 __git_compute_all_commands
566 for i
in $__git_all_commands
569 *--*) : helper pattern
;;
570 applymbox
) : ask gittus
;;
571 applypatch
) : ask gittus
;;
572 archimport
) : import
;;
573 cat-file
) : plumbing
;;
574 check-attr
) : plumbing
;;
575 check-ignore
) : plumbing
;;
576 check-ref-format
) : plumbing
;;
577 checkout-index
) : plumbing
;;
578 commit-tree
) : plumbing
;;
579 count-objects
) : infrequent
;;
580 credential-cache
) : credentials helper
;;
581 credential-store
) : credentials helper
;;
582 cvsexportcommit
) : export;;
583 cvsimport
) : import
;;
584 cvsserver
) : daemon
;;
586 diff-files
) : plumbing
;;
587 diff-index
) : plumbing
;;
588 diff-tree
) : plumbing
;;
589 fast-import
) : import
;;
590 fast-export
) : export;;
591 fsck-objects
) : plumbing
;;
592 fetch-pack
) : plumbing
;;
593 fmt-merge-msg
) : plumbing
;;
594 for-each-ref
) : plumbing
;;
595 hash-object
) : plumbing
;;
596 http-
*) : transport
;;
597 index-pack
) : plumbing
;;
598 init-db
) : deprecated
;;
599 local-fetch
) : plumbing
;;
600 lost-found
) : infrequent
;;
601 ls-files
) : plumbing
;;
602 ls-remote
) : plumbing
;;
603 ls-tree
) : plumbing
;;
604 mailinfo
) : plumbing
;;
605 mailsplit
) : plumbing
;;
606 merge-
*) : plumbing
;;
609 pack-objects
) : plumbing
;;
610 pack-redundant
) : plumbing
;;
611 pack-refs
) : plumbing
;;
612 parse-remote
) : plumbing
;;
613 patch-id
) : plumbing
;;
614 peek-remote
) : plumbing
;;
616 prune-packed
) : plumbing
;;
617 quiltimport
) : import
;;
618 read-tree
) : plumbing
;;
619 receive-pack
) : plumbing
;;
620 remote-
*) : transport
;;
621 repo-config
) : deprecated
;;
623 rev-list
) : plumbing
;;
624 rev-parse
) : plumbing
;;
625 runstatus
) : plumbing
;;
626 sh-setup
) : internal
;;
628 show-ref
) : plumbing
;;
629 send-pack
) : plumbing
;;
630 show-index
) : plumbing
;;
632 stripspace
) : plumbing
;;
633 symbolic-ref
) : plumbing
;;
634 tar-tree
) : deprecated
;;
635 unpack-file
) : plumbing
;;
636 unpack-objects
) : plumbing
;;
637 update-index
) : plumbing
;;
638 update-ref
) : plumbing
;;
639 update-server-info
) : daemon
;;
640 upload-archive
) : plumbing
;;
641 upload-pack
) : plumbing
;;
642 write-tree
) : plumbing
;;
644 verify-pack
) : infrequent
;;
645 verify-tag
) : plumbing
;;
651 __git_porcelain_commands
=
652 __git_compute_porcelain_commands
()
654 __git_compute_all_commands
655 test -n "$__git_porcelain_commands" ||
656 __git_porcelain_commands
=$
(__git_list_porcelain_commands
)
659 __git_pretty_aliases
()
662 for i
in $
(git
--git-dir="$(__gitdir)" config
--get-regexp "pretty\..*" 2>/dev
/null
); do
675 for i
in $
(git
--git-dir="$(__gitdir)" config
--get-regexp "alias\..*" 2>/dev
/null
); do
685 # __git_aliased_command requires 1 argument
686 __git_aliased_command
()
688 local word cmdline
=$
(git
--git-dir="$(__gitdir)" \
689 config
--get "alias.$1")
690 for word
in $cmdline; do
696 \
!*) : shell
command alias ;;
698 *=*) : setting env
;;
707 # __git_find_on_cmdline requires 1 argument
708 __git_find_on_cmdline
()
710 local word subcommand c
=1
711 while [ $c -lt $cword ]; do
713 for subcommand
in $1; do
714 if [ "$subcommand" = "$word" ]; then
723 __git_has_doubledash
()
726 while [ $c -lt $cword ]; do
727 if [ "--" = "${words[c]}" ]; then
735 __git_whitespacelist
="nowarn warn error error-all fix"
739 local dir
="$(__gitdir)"
740 if [ -d "$dir"/rebase-apply
]; then
741 __gitcomp
"--skip --continue --resolved --abort"
746 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
751 --3way --committer-date-is-author-date --ignore-date
752 --ignore-whitespace --ignore-space-change
753 --interactive --keep --no-utf8 --signoff --utf8
754 --whitespace= --scissors
765 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
770 --stat --numstat --summary --check --index
771 --cached --index-info --reverse --reject --unidiff-zero
772 --apply --no-add --exclude=
773 --ignore-whitespace --ignore-space-change
774 --whitespace= --inaccurate-eof --verbose
783 __git_has_doubledash
&& return
788 --interactive --refresh --patch --update --dry-run
789 --ignore-errors --intent-to-add
800 __gitcomp
"$(git archive --list)" "" "${cur##--format=}"
804 __gitcomp_nl
"$(__git_remotes)" "" "${cur##--remote=}"
809 --format= --list --verbose
810 --prefix= --remote= --exec=
820 __git_has_doubledash
&& return
822 local subcommands
="start bad good skip reset visualize replay log run"
823 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
824 if [ -z "$subcommand" ]; then
825 if [ -f "$(__gitdir)"/BISECT_START
]; then
826 __gitcomp
"$subcommands"
828 __gitcomp
"replay start"
833 case "$subcommand" in
834 bad|good|
reset|skip|start
)
835 __gitcomp_nl
"$(__git_refs)"
845 local i c
=1 only_local_ref
="n" has_r
="n"
847 while [ $c -lt $cword ]; do
850 -d|
-m) only_local_ref
="y" ;;
858 __gitcomp
"$(__git_refs)" "" "${cur##--set-upstream-to=}"
862 --color --no-color --verbose --abbrev= --no-abbrev
863 --track --no-track --contains --merged --no-merged
864 --set-upstream-to= --edit-description --list
869 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
870 __gitcomp_nl
"$(__git_heads)"
872 __gitcomp_nl
"$(__git_refs)"
880 local cmd
="${words[2]}"
883 __gitcomp
"create list-heads verify unbundle"
891 __git_complete_revlist
900 __git_has_doubledash
&& return
904 __gitcomp
"diff3 merge" "" "${cur##--conflict=}"
908 --quiet --ours --theirs --track --no-track --merge
909 --conflict= --orphan --patch
913 # check if --track, --no-track, or --no-guess was specified
914 # if so, disable DWIM mode
915 local flags
="--track --no-track --no-guess" track
=1
916 if [ -n "$(__git_find_on_cmdline "$flags")" ]; then
919 __gitcomp_nl
"$(__git_refs '' $track)"
926 __gitcomp
"$(__git_refs)"
933 __gitcomp
"--edit --no-commit"
936 __gitcomp_nl
"$(__git_refs)"
943 __git_has_doubledash
&& return
947 __gitcomp
"--dry-run --quiet"
982 __git_has_doubledash
&& return
986 __gitcomp_nl
"$(__git_refs)" "" "${cur}"
993 __gitcomp
"default strip verbatim whitespace
994 " "" "${cur##--cleanup=}"
997 --reuse-message=*|
--reedit-message=*|\
998 --fixup=*|
--squash=*)
999 __gitcomp_nl
"$(__git_refs)" "" "${cur#*=}"
1002 --untracked-files=*)
1003 __gitcomp
"all no normal" "" "${cur##--untracked-files=}"
1008 --all --author= --signoff --verify --no-verify
1010 --amend --include --only --interactive
1011 --dry-run --reuse-message= --reedit-message=
1012 --reset-author --file= --message= --template=
1013 --cleanup= --untracked-files --untracked-files=
1014 --verbose --quiet --fixup= --squash=
1026 --all --tags --contains --abbrev= --candidates=
1027 --exact-match --debug --long --match --always
1031 __gitcomp_nl
"$(__git_refs)"
1034 __git_diff_common_options
="--stat --numstat --shortstat --summary
1035 --patch-with-stat --name-only --name-status --color
1036 --no-color --color-words --no-renames --check
1037 --full-index --binary --abbrev --diff-filter=
1038 --find-copies-harder
1039 --text --ignore-space-at-eol --ignore-space-change
1040 --ignore-all-space --exit-code --quiet --ext-diff
1042 --no-prefix --src-prefix= --dst-prefix=
1043 --inter-hunk-context=
1046 --dirstat --dirstat= --dirstat-by-file
1047 --dirstat-by-file= --cumulative
1052 __git_has_doubledash
&& return
1056 __gitcomp
"--cached --staged --pickaxe-all --pickaxe-regex
1057 --base --ours --theirs --no-index
1058 $__git_diff_common_options
1063 __git_complete_revlist_file
1066 __git_mergetools_common
="diffuse ecmerge emerge kdiff3 meld opendiff
1067 tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc3 codecompare
1072 __git_has_doubledash
&& return
1076 __gitcomp
"$__git_mergetools_common kompare" "" "${cur##--tool=}"
1080 __gitcomp
"--cached --staged --pickaxe-all --pickaxe-regex
1081 --base --ours --theirs
1082 --no-renames --diff-filter= --find-copies-harder
1083 --relative --ignore-submodules
1091 __git_fetch_options
="
1092 --quiet --verbose --append --upload-pack --force --keep --depth=
1093 --tags --no-tags --all --prune --dry-run
1100 __gitcomp
"$__git_fetch_options"
1104 __git_complete_remote_or_refspec
1107 __git_format_patch_options
="
1108 --stdout --attach --no-attach --thread --thread= --output-directory
1109 --numbered --start-number --numbered-files --keep-subject --signoff
1110 --signature --no-signature --in-reply-to= --cc= --full-index --binary
1111 --not --all --cover-letter --no-prefix --src-prefix= --dst-prefix=
1112 --inline --suffix= --ignore-if-in-upstream --subject-prefix=
1115 _git_format_patch
()
1121 " "" "${cur##--thread=}"
1125 __gitcomp
"$__git_format_patch_options"
1129 __git_complete_revlist
1137 --tags --root --unreachable --cache --no-reflogs --full
1138 --strict --verbose --lost-found
1150 __gitcomp
"--prune --aggressive"
1162 __git_match_ctag
() {
1163 awk "/^${1////\\/}/ { print \$1 }" "$2"
1168 __git_has_doubledash
&& return
1174 --text --ignore-case --word-regexp --invert-match
1175 --full-name --line-number
1176 --extended-regexp --basic-regexp --fixed-strings
1178 --files-with-matches --name-only
1179 --files-without-match
1182 --and --or --not --all-match
1188 case "$cword,$prev" in
1190 if test -r tags
; then
1191 __gitcomp_nl
"$(__git_match_ctag "$cur" tags)"
1197 __gitcomp_nl
"$(__git_refs)"
1204 __gitcomp
"--all --info --man --web"
1208 __git_compute_all_commands
1209 __gitcomp
"$__git_all_commands $(__git_aliases)
1210 attributes cli core-tutorial cvs-migration
1211 diffcore gitk glossary hooks ignore modules
1212 namespaces repository-layout tutorial tutorial-2
1222 false true umask group all world everybody
1223 " "" "${cur##--shared=}"
1227 __gitcomp
"--quiet --bare --template= --shared --shared="
1236 __git_has_doubledash
&& return
1240 __gitcomp
"--cached --deleted --modified --others --ignored
1241 --stage --directory --no-empty-directory --unmerged
1242 --killed --exclude= --exclude-from=
1243 --exclude-per-directory= --exclude-standard
1244 --error-unmatch --with-tree= --full-name
1245 --abbrev --ignored --exclude-per-directory
1255 __gitcomp_nl
"$(__git_remotes)"
1263 # Options that go well for log, shortlog and gitk
1264 __git_log_common_options
="
1266 --branches --tags --remotes
1267 --first-parent --merges --no-merges
1269 --max-age= --since= --after=
1270 --min-age= --until= --before=
1271 --min-parents= --max-parents=
1272 --no-min-parents --no-max-parents
1274 # Options that go well for log and gitk (not shortlog)
1275 __git_log_gitk_options
="
1276 --dense --sparse --full-history
1277 --simplify-merges --simplify-by-decoration
1278 --left-right --notes --no-notes
1280 # Options that go well for log and shortlog (not gitk)
1281 __git_log_shortlog_options
="
1282 --author= --committer= --grep=
1286 __git_log_pretty_formats
="oneline short medium full fuller email raw format:"
1287 __git_log_date_formats
="relative iso8601 rfc2822 short local default raw"
1291 __git_has_doubledash
&& return
1293 local g
="$(git rev-parse --git-dir 2>/dev/null)"
1295 if [ -f "$g/MERGE_HEAD" ]; then
1299 --pretty=*|
--format=*)
1300 __gitcomp
"$__git_log_pretty_formats $(__git_pretty_aliases)
1305 __gitcomp
"$__git_log_date_formats" "" "${cur##--date=}"
1309 __gitcomp
"long short" "" "${cur##--decorate=}"
1314 $__git_log_common_options
1315 $__git_log_shortlog_options
1316 $__git_log_gitk_options
1317 --root --topo-order --date-order --reverse
1318 --follow --full-diff
1319 --abbrev-commit --abbrev=
1320 --relative-date --date=
1321 --pretty= --format= --oneline
1324 --decorate --decorate=
1326 --parents --children
1328 $__git_diff_common_options
1329 --pickaxe-all --pickaxe-regex
1334 __git_complete_revlist
1337 __git_merge_options
="
1338 --no-commit --no-stat --log --no-log --squash --strategy
1339 --commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit
1344 __git_complete_strategy
&& return
1348 __gitcomp
"$__git_merge_options"
1351 __gitcomp_nl
"$(__git_refs)"
1358 __gitcomp
"$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1371 __gitcomp_nl
"$(__git_refs)"
1378 __gitcomp
"--dry-run"
1387 __gitcomp
"--tags --all --stdin"
1392 local subcommands
='add append copy edit list prune remove show'
1393 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1395 case "$subcommand,$cur" in
1402 __gitcomp_nl
"$(__git_refs)"
1405 __gitcomp
"$subcommands --ref"
1409 add
,--reuse-message=*|append
,--reuse-message=*|\
1410 add
,--reedit-message=*|append
,--reedit-message=*)
1411 __gitcomp_nl
"$(__git_refs)" "" "${cur#*=}"
1414 __gitcomp
'--file= --message= --reedit-message=
1421 __gitcomp
'--dry-run --verbose'
1430 __gitcomp_nl
"$(__git_refs)"
1439 __git_complete_strategy
&& return
1444 --rebase --no-rebase
1445 $__git_merge_options
1446 $__git_fetch_options
1451 __git_complete_remote_or_refspec
1458 __gitcomp_nl
"$(__git_remotes)"
1463 __gitcomp_nl
"$(__git_remotes)" "" "${cur##--repo=}"
1468 --all --mirror --tags --dry-run --force --verbose
1469 --receive-pack= --repo= --set-upstream
1474 __git_complete_remote_or_refspec
1479 local dir
="$(__gitdir)"
1480 if [ -d "$dir"/rebase-apply
] ||
[ -d "$dir"/rebase-merge
]; then
1481 __gitcomp
"--continue --skip --abort"
1484 __git_complete_strategy
&& return
1487 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
1492 --onto --merge --strategy --interactive
1493 --preserve-merges --stat --no-stat
1494 --committer-date-is-author-date --ignore-date
1495 --ignore-whitespace --whitespace=
1501 __gitcomp_nl
"$(__git_refs)"
1506 local subcommands
="show delete expire"
1507 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1509 if [ -z "$subcommand" ]; then
1510 __gitcomp
"$subcommands"
1512 __gitcomp_nl
"$(__git_refs)"
1516 __git_send_email_confirm_options
="always never auto cc compose"
1517 __git_send_email_suppresscc_options
="author self cc bodycc sob cccmd body all"
1524 $__git_send_email_confirm_options
1525 " "" "${cur##--confirm=}"
1530 $__git_send_email_suppresscc_options
1531 " "" "${cur##--suppress-cc=}"
1535 --smtp-encryption=*)
1536 __gitcomp
"ssl tls" "" "${cur##--smtp-encryption=}"
1542 " "" "${cur##--thread=}"
1546 __gitcomp
"--annotate --bcc --cc --cc-cmd --chain-reply-to
1547 --compose --confirm= --dry-run --envelope-sender
1549 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1550 --no-suppress-from --no-thread --quiet
1551 --signed-off-by-cc --smtp-pass --smtp-server
1552 --smtp-server-port --smtp-encryption= --smtp-user
1553 --subject --suppress-cc= --suppress-from --thread --to
1554 --validate --no-validate
1555 $__git_format_patch_options"
1559 __git_complete_revlist
1567 __git_config_get_set_variables
()
1569 local prevword word config_file
= c
=$cword
1570 while [ $c -gt 1 ]; do
1573 --global|
--system|
--file=*)
1578 config_file
="$word $prevword"
1586 git
--git-dir="$(__gitdir)" config
$config_file --list 2>/dev
/null |
1601 __gitcomp_nl
"$(__git_remotes)"
1605 __gitcomp_nl
"$(__git_refs)"
1609 local remote
="${prev#remote.}"
1610 remote
="${remote%.fetch}"
1611 if [ -z "$cur" ]; then
1612 COMPREPLY
=("refs/heads/")
1615 __gitcomp_nl
"$(__git_refs_remotes "$remote")"
1619 local remote
="${prev#remote.}"
1620 remote
="${remote%.push}"
1621 __gitcomp_nl
"$(git --git-dir="$
(__gitdir
)" \
1622 for-each-ref --format='%(refname):%(refname)' \
1626 pull.twohead|pull.octopus
)
1627 __git_compute_merge_strategies
1628 __gitcomp
"$__git_merge_strategies"
1631 color.branch|color.
diff|color.interactive|\
1632 color.showbranch|color.status|color.ui
)
1633 __gitcomp
"always never auto"
1637 __gitcomp
"false true"
1642 normal black red green yellow blue magenta cyan white
1643 bold dim ul blink reverse
1648 __gitcomp
"man info web html"
1652 __gitcomp
"$__git_log_date_formats"
1655 sendemail.aliasesfiletype
)
1656 __gitcomp
"mutt mailrc pine elm gnus"
1660 __gitcomp
"$__git_send_email_confirm_options"
1663 sendemail.suppresscc
)
1664 __gitcomp
"$__git_send_email_suppresscc_options"
1667 --get|
--get-all|
--unset|
--unset-all)
1668 __gitcomp_nl
"$(__git_config_get_set_variables)"
1679 --global --system --file=
1680 --list --replace-all
1681 --get --get-all --get-regexp
1682 --add --unset --unset-all
1683 --remove-section --rename-section
1688 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1689 __gitcomp
"remote merge mergeoptions rebase" "$pfx" "$cur_"
1693 local pfx
="${cur%.*}." cur_
="${cur#*.}"
1694 __gitcomp_nl
"$(__git_heads)" "$pfx" "$cur_" "."
1698 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1700 argprompt cmd confirm needsfile noconsole norescan
1701 prompt revprompt revunmerged title
1706 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1707 __gitcomp
"cmd path" "$pfx" "$cur_"
1711 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1712 __gitcomp
"cmd path" "$pfx" "$cur_"
1716 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1717 __gitcomp
"cmd path trustExitCode" "$pfx" "$cur_"
1721 local pfx
="${cur%.*}." cur_
="${cur#*.}"
1722 __git_compute_all_commands
1723 __gitcomp_nl
"$__git_all_commands" "$pfx" "$cur_"
1727 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1729 url proxy fetch push mirror skipDefaultUpdate
1730 receivepack uploadpack tagopt pushurl
1735 local pfx
="${cur%.*}." cur_
="${cur#*.}"
1736 __gitcomp_nl
"$(__git_remotes)" "$pfx" "$cur_" "."
1740 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1741 __gitcomp
"insteadOf pushInsteadOf" "$pfx" "$cur_"
1747 advice.commitBeforeMerge
1749 advice.implicitIdentity
1750 advice.pushNonFastForward
1751 advice.resolveConflict
1755 apply.ignorewhitespace
1757 branch.autosetupmerge
1758 branch.autosetuprebase
1762 color.branch.current
1767 color.decorate.branch
1768 color.decorate.remoteBranch
1769 color.decorate.stash
1779 color.diff.whitespace
1784 color.grep.linenumber
1787 color.grep.separator
1789 color.interactive.error
1790 color.interactive.header
1791 color.interactive.help
1792 color.interactive.prompt
1797 color.status.changed
1799 color.status.nobranch
1800 color.status.untracked
1801 color.status.updated
1810 core.bigFileThreshold
1813 core.deltaBaseCacheLimit
1818 core.fsyncobjectfiles
1820 core.ignoreCygwinFSTricks
1823 core.logAllRefUpdates
1824 core.loosecompression
1827 core.packedGitWindowSize
1829 core.preferSymlinkRefs
1832 core.repositoryFormatVersion
1834 core.sharedRepository
1838 core.warnAmbiguousRefs
1841 diff.autorefreshindex
1844 diff.ignoreSubmodules
1849 diff.suppressBlankEmpty
1854 fetch.recurseSubmodules
1863 format.subjectprefix
1874 gc.reflogexpireunreachable
1878 gitcvs.commitmsgannotation
1879 gitcvs.dbTableNamePrefix
1890 gui.copyblamethreshold
1894 gui.matchtrackingbranch
1895 gui.newbranchtemplate
1896 gui.pruneduringfetch
1897 gui.spellingdictionary
1912 http.sslCertPasswordProtected
1917 i18n.logOutputEncoding
1923 imap.preformattedHTML
1933 interactive.singlekey
1949 mergetool.keepBackup
1950 mergetool.keepTemporaries
1955 notes.rewrite.rebase
1959 pack.deltaCacheLimit
1975 receive.denyCurrentBranch
1976 receive.denyDeleteCurrent
1978 receive.denyNonFastForwards
1981 receive.updateserverinfo
1983 repack.usedeltabaseoffset
1987 sendemail.aliasesfile
1988 sendemail.aliasfiletype
1992 sendemail.chainreplyto
1994 sendemail.envelopesender
1998 sendemail.signedoffbycc
1999 sendemail.smtpdomain
2000 sendemail.smtpencryption
2002 sendemail.smtpserver
2003 sendemail.smtpserveroption
2004 sendemail.smtpserverport
2006 sendemail.suppresscc
2007 sendemail.suppressfrom
2012 status.relativePaths
2013 status.showUntrackedFiles
2014 status.submodulesummary
2017 transfer.unpackLimit
2029 local subcommands
="add rename remove set-head set-branches set-url show prune update"
2030 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
2031 if [ -z "$subcommand" ]; then
2032 __gitcomp
"$subcommands"
2036 case "$subcommand" in
2037 rename|remove|set-url|show|prune
)
2038 __gitcomp_nl
"$(__git_remotes)"
2040 set-head|set-branches
)
2041 __git_complete_remote_or_refspec
2044 local i c
='' IFS
=$
'\n'
2045 for i
in $
(git
--git-dir="$(__gitdir)" config
--get-regexp "remotes\..*" 2>/dev
/null
); do
2059 __gitcomp_nl
"$(__git_refs)"
2064 __git_has_doubledash
&& return
2068 __gitcomp
"--merge --mixed --hard --soft --patch"
2072 __gitcomp_nl
"$(__git_refs)"
2079 __gitcomp
"--edit --mainline --no-edit --no-commit --signoff"
2083 __gitcomp_nl
"$(__git_refs)"
2088 __git_has_doubledash
&& return
2092 __gitcomp
"--cached --dry-run --ignore-unmatch --quiet"
2101 __git_has_doubledash
&& return
2106 $__git_log_common_options
2107 $__git_log_shortlog_options
2108 --numbered --summary
2113 __git_complete_revlist
2118 __git_has_doubledash
&& return
2121 --pretty=*|
--format=*)
2122 __gitcomp
"$__git_log_pretty_formats $(__git_pretty_aliases)
2127 __gitcomp
"--pretty= --format= --abbrev-commit --oneline
2128 $__git_diff_common_options
2141 --all --remotes --topo-order --current --more=
2142 --list --independent --merge-base --no-name
2144 --sha1-name --sparse --topics --reflog
2149 __git_complete_revlist
2154 local save_opts
='--keep-index --no-keep-index --quiet --patch'
2155 local subcommands
='save list show apply clear drop pop create branch'
2156 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
2157 if [ -z "$subcommand" ]; then
2160 __gitcomp
"$save_opts"
2163 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2164 __gitcomp
"$subcommands"
2171 case "$subcommand,$cur" in
2173 __gitcomp
"$save_opts"
2176 __gitcomp
"--index --quiet"
2178 show
,--*|drop
,--*|branch
,--*)
2181 show
,*|apply
,*|drop
,*|pop
,*|branch
,*)
2182 __gitcomp_nl
"$(git --git-dir="$
(__gitdir
)" stash list \
2183 | sed -n -e 's/:.*//p')"
2194 __git_has_doubledash
&& return
2196 local subcommands
="add status init update summary foreach sync"
2197 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2200 __gitcomp
"--quiet --cached"
2203 __gitcomp
"$subcommands"
2213 init fetch clone rebase dcommit log find-rev
2214 set-tree commit-diff info create-ignore propget
2215 proplist show-ignore show-externals branch tag blame
2216 migrate mkdirs reset gc
2218 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
2219 if [ -z "$subcommand" ]; then
2220 __gitcomp
"$subcommands"
2222 local remote_opts
="--username= --config-dir= --no-auth-cache"
2224 --follow-parent --authors-file= --repack=
2225 --no-metadata --use-svm-props --use-svnsync-props
2226 --log-window-size= --no-checkout --quiet
2227 --repack-flags --use-log-author --localtime
2228 --ignore-paths= $remote_opts
2231 --template= --shared= --trunk= --tags=
2232 --branches= --stdlayout --minimize-url
2233 --no-metadata --use-svm-props --use-svnsync-props
2234 --rewrite-root= --prefix= --use-log-author
2235 --add-author-from $remote_opts
2238 --edit --rmdir --find-copies-harder --copy-similarity=
2241 case "$subcommand,$cur" in
2243 __gitcomp
"--revision= --fetch-all $fc_opts"
2246 __gitcomp
"--revision= $fc_opts $init_opts"
2249 __gitcomp
"$init_opts"
2253 --merge --strategy= --verbose --dry-run
2254 --fetch-all --no-rebase --commit-url
2255 --revision --interactive $cmt_opts $fc_opts
2259 __gitcomp
"--stdin $cmt_opts $fc_opts"
2261 create-ignore
,--*|propget
,--*|proplist
,--*|show-ignore
,--*|\
2262 show-externals
,--*|mkdirs
,--*)
2263 __gitcomp
"--revision="
2267 --limit= --revision= --verbose --incremental
2268 --oneline --show-commit --non-recursive
2269 --authors-file= --color
2274 --merge --verbose --strategy= --local
2275 --fetch-all --dry-run $fc_opts
2279 __gitcomp
"--message= --file= --revision= $cmt_opts"
2285 __gitcomp
"--dry-run --message --tag"
2288 __gitcomp
"--dry-run --message"
2291 __gitcomp
"--git-format"
2295 --config-dir= --ignore-paths= --minimize
2296 --no-auth-cache --username=
2300 __gitcomp
"--revision= --parent"
2312 while [ $c -lt $cword ]; do
2316 __gitcomp_nl
"$(__git_tags)"
2332 __gitcomp_nl
"$(__git_tags)"
2338 __gitcomp_nl
"$(__git_refs)"
2350 local i c
=1 command __git_dir
2352 while [ $c -lt $cword ]; do
2355 --git-dir=*) __git_dir
="${i#--git-dir=}" ;;
2356 --bare) __git_dir
="." ;;
2357 --help) command="help"; break ;;
2360 *) command="$i"; break ;;
2365 if [ -z "$command" ]; then
2379 --no-replace-objects
2383 *) __git_compute_porcelain_commands
2384 __gitcomp
"$__git_porcelain_commands $(__git_aliases)" ;;
2389 local completion_func
="_git_${command//-/_}"
2390 declare -f $completion_func >/dev
/null
&& $completion_func && return
2392 local expansion
=$
(__git_aliased_command
"$command")
2393 if [ -n "$expansion" ]; then
2394 completion_func
="_git_${expansion//-/_}"
2395 declare -f $completion_func >/dev
/null
&& $completion_func
2401 __git_has_doubledash
&& return
2403 local g
="$(__gitdir)"
2405 if [ -f "$g/MERGE_HEAD" ]; then
2411 $__git_log_common_options
2412 $__git_log_gitk_options
2418 __git_complete_revlist
2421 if [[ -n ${ZSH_VERSION-} ]]; then
2422 echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
2424 autoload
-U +X compinit
&& compinit
2430 local cur_
="${3-$cur}"
2436 local c IFS
=$
' \t\n'
2444 array
[$#array+1]="$c"
2447 compadd
-Q -S '' -p "${2-}" -a -- array
&& _ret
=0
2458 compadd
-Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0
2464 local cur cword prev
2465 cur=${words[CURRENT-1]}
2466 prev=${words[CURRENT-2]}
2476 let _ret && _default -S '' && _ret=0
2480 compdef _git git gitk
2486 local cur words cword prev
2487 _get_comp_words_by_ref -n =: cur words cword prev
2491 # Setup completion for certain functions defined above by setting common
2492 # variables and workarounds.
2493 # This is NOT a public function; use at your own risk.
2496 local wrapper="__git_wrap
${2}"
2497 eval "$wrapper () { __git_func_wrap
$2 ; }"
2498 complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \
2499 || complete -o default -o nospace -F $wrapper $1
2502 # wrapper for backwards compatibility
2505 __git_wrap__git_main
2508 # wrapper for backwards compatibility
2511 __git_wrap__gitk_main
2514 __git_complete git __git_main
2515 __git_complete gitk __gitk_main
2517 # The following are necessary only for Cygwin, and only are needed
2518 # when the user has tab-completed the executable name and consequently
2519 # included the '.exe' suffix.
2521 if [ Cygwin = "$
(uname
-o 2>/dev
/null
)" ]; then
2522 __git_complete git.exe __git_main