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 # *) file paths within current working directory and index
17 # *) common --long-options
19 # To use these routines:
21 # 1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
22 # 2) Add the following line to your .bashrc/.zshrc:
23 # source ~/.git-completion.sh
24 # 3) Consider changing your PS1 to also show the current branch,
25 # see git-prompt.sh for details.
27 case "$COMP_WORDBREAKS" in
29 *) COMP_WORDBREAKS
="$COMP_WORDBREAKS:"
32 # __gitdir accepts 0 or 1 arguments (i.e., location)
33 # returns location of .git repo
36 # Note: this function is duplicated in git-prompt.sh
37 # When updating it, make sure you update the other one to match.
38 if [ -z "${1-}" ]; then
39 if [ -n "${__git_dir-}" ]; then
41 elif [ -n "${GIT_DIR-}" ]; then
42 test -d "${GIT_DIR-}" ||
return 1
44 elif [ -d .git
]; then
47 git rev-parse
--git-dir 2>/dev
/null
49 elif [ -d "$1/.git" ]; then
56 # The following function is based on code from:
58 # bash_completion - programmable completion functions for bash 3.2+
60 # Copyright © 2006-2008, Ian Macdonald <ian@caliban.org>
61 # © 2009-2010, Bash Completion Maintainers
62 # <bash-completion-devel@lists.alioth.debian.org>
64 # This program is free software; you can redistribute it and/or modify
65 # it under the terms of the GNU General Public License as published by
66 # the Free Software Foundation; either version 2, or (at your option)
69 # This program is distributed in the hope that it will be useful,
70 # but WITHOUT ANY WARRANTY; without even the implied warranty of
71 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
72 # GNU General Public License for more details.
74 # You should have received a copy of the GNU General Public License
75 # along with this program; if not, write to the Free Software Foundation,
76 # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
78 # The latest version of this software can be obtained here:
80 # http://bash-completion.alioth.debian.org/
84 # This function can be used to access a tokenized list of words
85 # on the command line:
87 # __git_reassemble_comp_words_by_ref '=:'
88 # if test "${words_[cword_-1]}" = -w
93 # The argument should be a collection of characters from the list of
94 # word completion separators (COMP_WORDBREAKS) to treat as ordinary
97 # This is roughly equivalent to going back in time and setting
98 # COMP_WORDBREAKS to exclude those characters. The intent is to
99 # make option types like --date=<type> and <rev>:<path> easy to
100 # recognize by treating each shell word as a single token.
102 # It is best not to set COMP_WORDBREAKS directly because the value is
103 # shared with other completion scripts. By the time the completion
104 # function gets called, COMP_WORDS has already been populated so local
105 # changes to COMP_WORDBREAKS have no effect.
107 # Output: words_, cword_, cur_.
109 __git_reassemble_comp_words_by_ref
()
111 local exclude i j first
112 # Which word separators to exclude?
113 exclude
="${1//[^$COMP_WORDBREAKS]}"
115 if [ -z "$exclude" ]; then
116 words_
=("${COMP_WORDS[@]}")
119 # List of word completion separators has shrunk;
120 # re-assemble words to complete.
121 for ((i
=0, j
=0; i
< ${#COMP_WORDS[@]}; i
++, j
++)); do
122 # Append each nonempty word consisting of just
123 # word separator characters to the current word.
127 [ -n "${COMP_WORDS[$i]}" ] &&
128 # word consists of excluded word separators
129 [ "${COMP_WORDS[$i]//[^$exclude]}" = "${COMP_WORDS[$i]}" ]
131 # Attach to the previous token,
132 # unless the previous token is the command name.
133 if [ $j -ge 2 ] && [ -n "$first" ]; then
137 words_
[$j]=${words_[j]}${COMP_WORDS[i]}
138 if [ $i = $COMP_CWORD ]; then
141 if (($i < ${#COMP_WORDS[@]} - 1)); then
148 words_
[$j]=${words_[j]}${COMP_WORDS[i]}
149 if [ $i = $COMP_CWORD ]; then
155 if ! type _get_comp_words_by_ref
>/dev
/null
2>&1; then
156 _get_comp_words_by_ref
()
158 local exclude cur_ words_ cword_
159 if [ "$1" = "-n" ]; then
163 __git_reassemble_comp_words_by_ref
"$exclude"
164 cur_
=${words_[cword_]}
165 while [ $# -gt 0 ]; do
171 prev
=${words_[$cword_-1]}
174 words
=("${words_[@]}")
189 if [[ "$x" == "$3"* ]]; then
190 COMPREPLY
[i
++]="$2$x$4"
195 # Generates completion reply, appending a space to possible completion words,
197 # It accepts 1 to 4 arguments:
198 # 1: List of possible completion words.
199 # 2: A prefix to be added to each possible completion word (optional).
200 # 3: Generate possible completion matches for this word (optional).
201 # 4: A suffix to be appended to each possible completion word (optional).
204 local cur_
="${3-$cur}"
210 local c i
=0 IFS
=$
' \t\n'
213 if [[ $c == "$cur_"* ]]; then
218 COMPREPLY
[i
++]="${2-}$c"
225 # Generates completion reply from newline-separated possible completion words
226 # by appending a space to all of them.
227 # It accepts 1 to 4 arguments:
228 # 1: List of possible completion words, separated by a single newline.
229 # 2: A prefix to be added to each possible completion word (optional).
230 # 3: Generate possible completion matches for this word (optional).
231 # 4: A suffix to be appended to each possible completion word instead of
232 # the default space (optional). If specified but empty, nothing is
237 __gitcompadd
"$1" "${2-}" "${3-$cur}" "${4- }"
240 # Generates completion reply with compgen from newline-separated possible
241 # completion filenames.
242 # It accepts 1 to 3 arguments:
243 # 1: List of possible completion filenames, separated by a single newline.
244 # 2: A directory prefix to be added to each possible completion filename
246 # 3: Generate possible completion matches for this word (optional).
251 # XXX does not work when the directory prefix contains a tilde,
252 # since tilde expansion is not applied.
253 # This means that COMPREPLY will be empty and Bash default
254 # completion will be used.
255 __gitcompadd
"$1" "${2-}" "${3-$cur}" ""
257 # use a hack to enable file mode in bash < 4
258 compopt
-o filenames
+o nospace
2>/dev
/null ||
259 compgen
-f /non-existing-dir
/ > /dev
/null
262 # Execute 'git ls-files', unless the --committable option is specified, in
263 # which case it runs 'git diff-index' to find out the files that can be
264 # committed. It return paths relative to the directory specified in the first
265 # argument, and using the options specified in the second argument.
266 __git_ls_files_helper
()
269 test -n "${CDPATH+set}" && unset CDPATH
271 if [ "$2" == "--committable" ]; then
272 git diff-index
--name-only --relative HEAD
274 # NOTE: $2 is not quoted in order to support multiple options
275 git ls-files
--exclude-standard $2
281 # __git_index_files accepts 1 or 2 arguments:
282 # 1: Options to pass to ls-files (required).
283 # 2: A directory path (optional).
284 # If provided, only files within the specified directory are listed.
285 # Sub directories are never recursed. Path must have a trailing
289 local dir
="$(__gitdir)" root
="${2-.}" file
291 if [ -d "$dir" ]; then
292 __git_ls_files_helper
"$root" "$1" |
293 while read -r file; do
295 ?
*/*) echo "${file%%/*}" ;;
304 local dir
="$(__gitdir)"
305 if [ -d "$dir" ]; then
306 git
--git-dir="$dir" for-each-ref
--format='%(refname:short)' \
314 local dir
="$(__gitdir)"
315 if [ -d "$dir" ]; then
316 git
--git-dir="$dir" for-each-ref
--format='%(refname:short)' \
322 # __git_refs accepts 0, 1 (to pass to __gitdir), or 2 arguments
323 # presence of 2nd argument means use the guess heuristic employed
324 # by checkout for tracking branches
327 local i
hash dir
="$(__gitdir "${1-}")" track
="${2-}"
329 if [ -d "$dir" ]; then
337 for i
in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD
; do
338 if [ -e "$dir/$i" ]; then echo $i; fi
340 format
="refname:short"
341 refs
="refs/tags refs/heads refs/remotes"
344 git
--git-dir="$dir" for-each-ref
--format="%($format)" \
346 if [ -n "$track" ]; then
347 # employ the heuristic used by git checkout
348 # Try to find a remote branch that matches the completion word
349 # but only output if the branch name is unique
351 git
--git-dir="$dir" for-each-ref
--shell --format="ref=%(refname:short)" \
353 while read -r entry
; do
356 if [[ "$ref" == "$cur"* ]]; then
359 done |
sort |
uniq -u
365 git ls-remote
"$dir" "$cur*" 2>/dev
/null | \
366 while read -r hash i
; do
375 git for-each-ref
--format="%(refname:short)" -- "refs/remotes/$dir/" |
sed -e "s#^$dir/##"
380 # __git_refs2 requires 1 argument (to pass to __git_refs)
384 for i
in $
(__git_refs
"$1"); do
389 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
390 __git_refs_remotes
()
393 git ls-remote
"$1" 'refs/heads/*' 2>/dev
/null | \
394 while read -r hash i
; do
395 echo "$i:refs/remotes/$1/${i#refs/heads/}"
401 local i IFS
=$
'\n' d
="$(__gitdir)"
402 test -d "$d/remotes" && ls -1 "$d/remotes"
403 for i
in $
(git
--git-dir="$d" config
--get-regexp 'remote\..*\.url' 2>/dev
/null
); do
409 __git_list_merge_strategies
()
411 git merge
-s help 2>&1 |
412 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
421 __git_merge_strategies
=
422 # 'git merge -s help' (and thus detection of the merge strategy
423 # list) fails, unfortunately, if run outside of any git working
424 # tree. __git_merge_strategies is set to the empty string in
425 # that case, and the detection will be repeated the next time it
427 __git_compute_merge_strategies
()
429 test -n "$__git_merge_strategies" ||
430 __git_merge_strategies
=$
(__git_list_merge_strategies
)
433 __git_complete_revlist_file
()
435 local pfx
ls ref cur_
="$cur"
455 case "$COMP_WORDBREAKS" in
457 *) pfx
="$ref:$pfx" ;;
460 __gitcomp_nl
"$(git --git-dir="$
(__gitdir
)" ls-tree "$ls" 2>/dev/null \
461 | sed '/^100... blob /{
477 pfx
="${cur_%...*}..."
479 __gitcomp_nl
"$(__git_refs)" "$pfx" "$cur_"
484 __gitcomp_nl
"$(__git_refs)" "$pfx" "$cur_"
487 __gitcomp_nl
"$(__git_refs)"
493 # __git_complete_index_file requires 1 argument:
494 # 1: the options to pass to ls-file
496 # The exception is --committable, which finds the files appropriate commit.
497 __git_complete_index_file
()
499 local pfx
="" cur_
="$cur"
509 __gitcomp_file
"$(__git_index_files "$1" "$pfx")" "$pfx" "$cur_"
512 __git_complete_file
()
514 __git_complete_revlist_file
517 __git_complete_revlist
()
519 __git_complete_revlist_file
522 __git_complete_remote_or_refspec
()
524 local cur_
="$cur" cmd
="${words[1]}"
525 local i c
=2 remote
="" pfx
="" lhs
=1 no_complete_refspec
=0
526 if [ "$cmd" = "remote" ]; then
529 while [ $c -lt $cword ]; do
532 --mirror) [ "$cmd" = "push" ] && no_complete_refspec
=1 ;;
535 push
) no_complete_refspec
=1 ;;
543 *) remote
="$i"; break ;;
547 if [ -z "$remote" ]; then
548 __gitcomp_nl
"$(__git_remotes)"
551 if [ $no_complete_refspec = 1 ]; then
554 [ "$remote" = "." ] && remote
=
557 case "$COMP_WORDBREAKS" in
559 *) pfx
="${cur_%%:*}:" ;;
571 if [ $lhs = 1 ]; then
572 __gitcomp_nl
"$(__git_refs2 "$remote")" "$pfx" "$cur_"
574 __gitcomp_nl
"$(__git_refs)" "$pfx" "$cur_"
578 if [ $lhs = 1 ]; then
579 __gitcomp_nl
"$(__git_refs "$remote")" "$pfx" "$cur_"
581 __gitcomp_nl
"$(__git_refs)" "$pfx" "$cur_"
585 if [ $lhs = 1 ]; then
586 __gitcomp_nl
"$(__git_refs)" "$pfx" "$cur_"
588 __gitcomp_nl
"$(__git_refs "$remote")" "$pfx" "$cur_"
594 __git_complete_strategy
()
596 __git_compute_merge_strategies
599 __gitcomp
"$__git_merge_strategies"
604 __gitcomp
"$__git_merge_strategies" "" "${cur##--strategy=}"
612 if test -n "${GIT_TESTING_COMMAND_COMPLETION:-}"
614 printf "%s" "${GIT_TESTING_COMMAND_COMPLETION}"
616 git
help -a|
egrep '^ [a-zA-Z0-9]'
620 __git_list_all_commands
()
623 for i
in $
(__git_commands
)
626 *--*) : helper pattern
;;
633 __git_compute_all_commands
()
635 test -n "$__git_all_commands" ||
636 __git_all_commands
=$
(__git_list_all_commands
)
639 __git_list_porcelain_commands
()
642 __git_compute_all_commands
643 for i
in $__git_all_commands
646 *--*) : helper pattern
;;
647 applymbox
) : ask gittus
;;
648 applypatch
) : ask gittus
;;
649 archimport
) : import
;;
650 cat-file
) : plumbing
;;
651 check-attr
) : plumbing
;;
652 check-ignore
) : plumbing
;;
653 check-mailmap
) : plumbing
;;
654 check-ref-format
) : plumbing
;;
655 checkout-index
) : plumbing
;;
656 commit-tree
) : plumbing
;;
657 count-objects
) : infrequent
;;
658 credential-cache
) : credentials helper
;;
659 credential-store
) : credentials helper
;;
660 cvsexportcommit
) : export;;
661 cvsimport
) : import
;;
662 cvsserver
) : daemon
;;
664 diff-files
) : plumbing
;;
665 diff-index
) : plumbing
;;
666 diff-tree
) : plumbing
;;
667 fast-import
) : import
;;
668 fast-export
) : export;;
669 fsck-objects
) : plumbing
;;
670 fetch-pack
) : plumbing
;;
671 fmt-merge-msg
) : plumbing
;;
672 for-each-ref
) : plumbing
;;
673 hash-object
) : plumbing
;;
674 http-
*) : transport
;;
675 index-pack
) : plumbing
;;
676 init-db
) : deprecated
;;
677 local-fetch
) : plumbing
;;
678 lost-found
) : infrequent
;;
679 ls-files
) : plumbing
;;
680 ls-remote
) : plumbing
;;
681 ls-tree
) : plumbing
;;
682 mailinfo
) : plumbing
;;
683 mailsplit
) : plumbing
;;
684 merge-
*) : plumbing
;;
687 pack-objects
) : plumbing
;;
688 pack-redundant
) : plumbing
;;
689 pack-refs
) : plumbing
;;
690 parse-remote
) : plumbing
;;
691 patch-id
) : plumbing
;;
692 peek-remote
) : plumbing
;;
694 prune-packed
) : plumbing
;;
695 quiltimport
) : import
;;
696 read-tree
) : plumbing
;;
697 receive-pack
) : plumbing
;;
698 remote-
*) : transport
;;
699 repo-config
) : deprecated
;;
701 rev-list
) : plumbing
;;
702 rev-parse
) : plumbing
;;
703 runstatus
) : plumbing
;;
704 sh-setup
) : internal
;;
706 show-ref
) : plumbing
;;
707 send-pack
) : plumbing
;;
708 show-index
) : plumbing
;;
710 stripspace
) : plumbing
;;
711 symbolic-ref
) : plumbing
;;
712 tar-tree
) : deprecated
;;
713 unpack-file
) : plumbing
;;
714 unpack-objects
) : plumbing
;;
715 update-index
) : plumbing
;;
716 update-ref
) : plumbing
;;
717 update-server-info
) : daemon
;;
718 upload-archive
) : plumbing
;;
719 upload-pack
) : plumbing
;;
720 write-tree
) : plumbing
;;
722 verify-pack
) : infrequent
;;
723 verify-tag
) : plumbing
;;
729 __git_porcelain_commands
=
730 __git_compute_porcelain_commands
()
732 __git_compute_all_commands
733 test -n "$__git_porcelain_commands" ||
734 __git_porcelain_commands
=$
(__git_list_porcelain_commands
)
737 __git_pretty_aliases
()
740 for i
in $
(git
--git-dir="$(__gitdir)" config
--get-regexp "pretty\..*" 2>/dev
/null
); do
753 for i
in $
(git
--git-dir="$(__gitdir)" config
--get-regexp "alias\..*" 2>/dev
/null
); do
763 # __git_aliased_command requires 1 argument
764 __git_aliased_command
()
766 local word cmdline
=$
(git
--git-dir="$(__gitdir)" \
767 config
--get "alias.$1")
768 for word
in $cmdline; do
774 \
!*) : shell
command alias ;;
776 *=*) : setting env
;;
785 # __git_find_on_cmdline requires 1 argument
786 __git_find_on_cmdline
()
788 local word subcommand c
=1
789 while [ $c -lt $cword ]; do
791 for subcommand
in $1; do
792 if [ "$subcommand" = "$word" ]; then
801 __git_has_doubledash
()
804 while [ $c -lt $cword ]; do
805 if [ "--" = "${words[c]}" ]; then
813 # Try to count non option arguments passed on the command line for the
814 # specified git command.
815 # When options are used, it is necessary to use the special -- option to
816 # tell the implementation were non option arguments begin.
817 # XXX this can not be improved, since options can appear everywhere, as
821 # __git_count_arguments requires 1 argument: the git command executed.
822 __git_count_arguments
()
826 # Skip "git" (first argument)
827 for ((i
=1; i
< ${#words[@]}; i
++)); do
832 # Good; we can assume that the following are only non
837 # Skip the specified git command and discard git
850 __git_whitespacelist
="nowarn warn error error-all fix"
854 local dir
="$(__gitdir)"
855 if [ -d "$dir"/rebase-apply
]; then
856 __gitcomp
"--skip --continue --resolved --abort"
861 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
866 --3way --committer-date-is-author-date --ignore-date
867 --ignore-whitespace --ignore-space-change
868 --interactive --keep --no-utf8 --signoff --utf8
869 --whitespace= --scissors
879 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
884 --stat --numstat --summary --check --index
885 --cached --index-info --reverse --reject --unidiff-zero
886 --apply --no-add --exclude=
887 --ignore-whitespace --ignore-space-change
888 --whitespace= --inaccurate-eof --verbose
899 --interactive --refresh --patch --update --dry-run
900 --ignore-errors --intent-to-add
905 # XXX should we check for --update and --all options ?
906 __git_complete_index_file
"--others --modified"
913 __gitcomp
"$(git archive --list)" "" "${cur##--format=}"
917 __gitcomp_nl
"$(__git_remotes)" "" "${cur##--remote=}"
922 --format= --list --verbose
923 --prefix= --remote= --exec=
933 __git_has_doubledash
&& return
935 local subcommands
="start bad good skip reset visualize replay log run"
936 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
937 if [ -z "$subcommand" ]; then
938 if [ -f "$(__gitdir)"/BISECT_START
]; then
939 __gitcomp
"$subcommands"
941 __gitcomp
"replay start"
946 case "$subcommand" in
947 bad|good|
reset|skip|start
)
948 __gitcomp_nl
"$(__git_refs)"
957 local i c
=1 only_local_ref
="n" has_r
="n"
959 while [ $c -lt $cword ]; do
962 -d|
-m) only_local_ref
="y" ;;
970 __gitcomp
"$(__git_refs)" "" "${cur##--set-upstream-to=}"
974 --color --no-color --verbose --abbrev= --no-abbrev
975 --track --no-track --contains --merged --no-merged
976 --set-upstream-to= --edit-description --list
981 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
982 __gitcomp_nl
"$(__git_heads)"
984 __gitcomp_nl
"$(__git_refs)"
992 local cmd
="${words[2]}"
995 __gitcomp
"create list-heads verify unbundle"
1003 __git_complete_revlist
1012 __git_has_doubledash
&& return
1016 __gitcomp
"diff3 merge" "" "${cur##--conflict=}"
1020 --quiet --ours --theirs --track --no-track --merge
1021 --conflict= --orphan --patch
1025 # check if --track, --no-track, or --no-guess was specified
1026 # if so, disable DWIM mode
1027 local flags
="--track --no-track --no-guess" track
=1
1028 if [ -n "$(__git_find_on_cmdline "$flags")" ]; then
1031 __gitcomp_nl
"$(__git_refs '' $track)"
1038 __gitcomp
"$(__git_refs)"
1043 local dir
="$(__gitdir)"
1044 if [ -f "$dir"/CHERRY_PICK_HEAD
]; then
1045 __gitcomp
"--continue --quit --abort"
1050 __gitcomp
"--edit --no-commit --signoff --strategy= --mainline"
1053 __gitcomp_nl
"$(__git_refs)"
1062 __gitcomp
"--dry-run --quiet"
1067 # XXX should we check for -x option ?
1068 __git_complete_index_file
"--others"
1100 __gitcomp_nl
"$(__git_refs)" "" "${cur}"
1107 __gitcomp
"default strip verbatim whitespace
1108 " "" "${cur##--cleanup=}"
1111 --reuse-message=*|
--reedit-message=*|\
1112 --fixup=*|
--squash=*)
1113 __gitcomp_nl
"$(__git_refs)" "" "${cur#*=}"
1116 --untracked-files=*)
1117 __gitcomp
"all no normal" "" "${cur##--untracked-files=}"
1122 --all --author= --signoff --verify --no-verify
1124 --amend --include --only --interactive
1125 --dry-run --reuse-message= --reedit-message=
1126 --reset-author --file= --message= --template=
1127 --cleanup= --untracked-files --untracked-files=
1128 --verbose --quiet --fixup= --squash=
1133 if git rev-parse
--verify --quiet HEAD
>/dev
/null
; then
1134 __git_complete_index_file
"--committable"
1136 # This is the first commit
1137 __git_complete_index_file
"--cached"
1146 --all --tags --contains --abbrev= --candidates=
1147 --exact-match --debug --long --match --always
1151 __gitcomp_nl
"$(__git_refs)"
1154 __git_diff_algorithms
="myers minimal patience histogram"
1156 __git_diff_common_options
="--stat --numstat --shortstat --summary
1157 --patch-with-stat --name-only --name-status --color
1158 --no-color --color-words --no-renames --check
1159 --full-index --binary --abbrev --diff-filter=
1160 --find-copies-harder
1161 --text --ignore-space-at-eol --ignore-space-change
1162 --ignore-all-space --exit-code --quiet --ext-diff
1164 --no-prefix --src-prefix= --dst-prefix=
1165 --inter-hunk-context=
1166 --patience --histogram --minimal
1168 --dirstat --dirstat= --dirstat-by-file
1169 --dirstat-by-file= --cumulative
1175 __git_has_doubledash
&& return
1179 __gitcomp
"$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
1183 __gitcomp
"--cached --staged --pickaxe-all --pickaxe-regex
1184 --base --ours --theirs --no-index
1185 $__git_diff_common_options
1190 __git_complete_revlist_file
1193 __git_mergetools_common
="diffuse ecmerge emerge kdiff3 meld opendiff
1194 tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc3 codecompare
1199 __git_has_doubledash
&& return
1203 __gitcomp
"$__git_mergetools_common kompare" "" "${cur##--tool=}"
1207 __gitcomp
"--cached --staged --pickaxe-all --pickaxe-regex
1208 --base --ours --theirs
1209 --no-renames --diff-filter= --find-copies-harder
1210 --relative --ignore-submodules
1215 __git_complete_revlist_file
1218 __git_fetch_options
="
1219 --quiet --verbose --append --upload-pack --force --keep --depth=
1220 --tags --no-tags --all --prune --dry-run
1227 __gitcomp
"$__git_fetch_options"
1231 __git_complete_remote_or_refspec
1234 __git_format_patch_options
="
1235 --stdout --attach --no-attach --thread --thread= --no-thread
1236 --numbered --start-number --numbered-files --keep-subject --signoff
1237 --signature --no-signature --in-reply-to= --cc= --full-index --binary
1238 --not --all --cover-letter --no-prefix --src-prefix= --dst-prefix=
1239 --inline --suffix= --ignore-if-in-upstream --subject-prefix=
1240 --output-directory --reroll-count --to= --quiet --notes
1243 _git_format_patch
()
1249 " "" "${cur##--thread=}"
1253 __gitcomp
"$__git_format_patch_options"
1257 __git_complete_revlist
1265 --tags --root --unreachable --cache --no-reflogs --full
1266 --strict --verbose --lost-found
1277 __gitcomp
"--prune --aggressive"
1288 __git_match_ctag
() {
1289 awk "/^${1////\\/}/ { print \$1 }" "$2"
1294 __git_has_doubledash
&& return
1300 --text --ignore-case --word-regexp --invert-match
1301 --full-name --line-number
1302 --extended-regexp --basic-regexp --fixed-strings
1304 --files-with-matches --name-only
1305 --files-without-match
1308 --and --or --not --all-match
1314 case "$cword,$prev" in
1316 if test -r tags
; then
1317 __gitcomp_nl
"$(__git_match_ctag "$cur" tags)"
1323 __gitcomp_nl
"$(__git_refs)"
1330 __gitcomp
"--all --info --man --web"
1334 __git_compute_all_commands
1335 __gitcomp
"$__git_all_commands $(__git_aliases)
1336 attributes cli core-tutorial cvs-migration
1337 diffcore gitk glossary hooks ignore modules
1338 namespaces repository-layout tutorial tutorial-2
1348 false true umask group all world everybody
1349 " "" "${cur##--shared=}"
1353 __gitcomp
"--quiet --bare --template= --shared --shared="
1363 __gitcomp
"--cached --deleted --modified --others --ignored
1364 --stage --directory --no-empty-directory --unmerged
1365 --killed --exclude= --exclude-from=
1366 --exclude-per-directory= --exclude-standard
1367 --error-unmatch --with-tree= --full-name
1368 --abbrev --ignored --exclude-per-directory
1374 # XXX ignore options like --modified and always suggest all cached
1376 __git_complete_index_file
"--cached"
1381 __gitcomp_nl
"$(__git_remotes)"
1389 # Options that go well for log, shortlog and gitk
1390 __git_log_common_options
="
1392 --branches --tags --remotes
1393 --first-parent --merges --no-merges
1395 --max-age= --since= --after=
1396 --min-age= --until= --before=
1397 --min-parents= --max-parents=
1398 --no-min-parents --no-max-parents
1400 # Options that go well for log and gitk (not shortlog)
1401 __git_log_gitk_options
="
1402 --dense --sparse --full-history
1403 --simplify-merges --simplify-by-decoration
1404 --left-right --notes --no-notes
1406 # Options that go well for log and shortlog (not gitk)
1407 __git_log_shortlog_options
="
1408 --author= --committer= --grep=
1412 __git_log_pretty_formats
="oneline short medium full fuller email raw format:"
1413 __git_log_date_formats
="relative iso8601 rfc2822 short local default raw"
1417 __git_has_doubledash
&& return
1419 local g
="$(git rev-parse --git-dir 2>/dev/null)"
1421 if [ -f "$g/MERGE_HEAD" ]; then
1425 --pretty=*|
--format=*)
1426 __gitcomp
"$__git_log_pretty_formats $(__git_pretty_aliases)
1431 __gitcomp
"$__git_log_date_formats" "" "${cur##--date=}"
1435 __gitcomp
"long short" "" "${cur##--decorate=}"
1440 $__git_log_common_options
1441 $__git_log_shortlog_options
1442 $__git_log_gitk_options
1443 --root --topo-order --date-order --reverse
1444 --follow --full-diff
1445 --abbrev-commit --abbrev=
1446 --relative-date --date=
1447 --pretty= --format= --oneline
1450 --decorate --decorate=
1452 --parents --children
1454 $__git_diff_common_options
1455 --pickaxe-all --pickaxe-regex
1460 __git_complete_revlist
1463 __git_merge_options
="
1464 --no-commit --no-stat --log --no-log --squash --strategy
1465 --commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit
1470 __git_complete_strategy
&& return
1474 __gitcomp
"$__git_merge_options"
1477 __gitcomp_nl
"$(__git_refs)"
1484 __gitcomp
"$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1496 __gitcomp_nl
"$(__git_refs)"
1503 __gitcomp
"--dry-run"
1508 if [ $
(__git_count_arguments
"mv") -gt 0 ]; then
1509 # We need to show both cached and untracked files (including
1510 # empty directories) since this may not be the last argument.
1511 __git_complete_index_file
"--cached --others --directory"
1513 __git_complete_index_file
"--cached"
1519 __gitcomp
"--tags --all --stdin"
1524 local subcommands
='add append copy edit list prune remove show'
1525 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1527 case "$subcommand,$cur" in
1534 __gitcomp_nl
"$(__git_refs)"
1537 __gitcomp
"$subcommands --ref"
1541 add
,--reuse-message=*|append
,--reuse-message=*|\
1542 add
,--reedit-message=*|append
,--reedit-message=*)
1543 __gitcomp_nl
"$(__git_refs)" "" "${cur#*=}"
1546 __gitcomp
'--file= --message= --reedit-message=
1553 __gitcomp
'--dry-run --verbose'
1562 __gitcomp_nl
"$(__git_refs)"
1571 __git_complete_strategy
&& return
1576 --rebase --no-rebase
1577 $__git_merge_options
1578 $__git_fetch_options
1583 __git_complete_remote_or_refspec
1590 __gitcomp_nl
"$(__git_remotes)"
1595 __gitcomp_nl
"$(__git_remotes)" "" "${cur##--repo=}"
1600 --all --mirror --tags --dry-run --force --verbose
1601 --receive-pack= --repo= --set-upstream
1606 __git_complete_remote_or_refspec
1611 local dir
="$(__gitdir)"
1612 if [ -d "$dir"/rebase-apply
] ||
[ -d "$dir"/rebase-merge
]; then
1613 __gitcomp
"--continue --skip --abort"
1616 __git_complete_strategy
&& return
1619 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
1624 --onto --merge --strategy --interactive
1625 --preserve-merges --stat --no-stat
1626 --committer-date-is-author-date --ignore-date
1627 --ignore-whitespace --whitespace=
1633 __gitcomp_nl
"$(__git_refs)"
1638 local subcommands
="show delete expire"
1639 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1641 if [ -z "$subcommand" ]; then
1642 __gitcomp
"$subcommands"
1644 __gitcomp_nl
"$(__git_refs)"
1648 __git_send_email_confirm_options
="always never auto cc compose"
1649 __git_send_email_suppresscc_options
="author self cc bodycc sob cccmd body all"
1656 $__git_send_email_confirm_options
1657 " "" "${cur##--confirm=}"
1662 $__git_send_email_suppresscc_options
1663 " "" "${cur##--suppress-cc=}"
1667 --smtp-encryption=*)
1668 __gitcomp
"ssl tls" "" "${cur##--smtp-encryption=}"
1674 " "" "${cur##--thread=}"
1678 __gitcomp
"--annotate --bcc --cc --cc-cmd --chain-reply-to
1679 --compose --confirm= --dry-run --envelope-sender
1681 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1682 --no-suppress-from --no-thread --quiet
1683 --signed-off-by-cc --smtp-pass --smtp-server
1684 --smtp-server-port --smtp-encryption= --smtp-user
1685 --subject --suppress-cc= --suppress-from --thread --to
1686 --validate --no-validate
1687 $__git_format_patch_options"
1691 __git_complete_revlist
1699 __git_config_get_set_variables
()
1701 local prevword word config_file
= c
=$cword
1702 while [ $c -gt 1 ]; do
1705 --system|
--global|
--local|
--file=*)
1710 config_file
="$word $prevword"
1718 git
--git-dir="$(__gitdir)" config
$config_file --list 2>/dev
/null |
1732 branch.
*.remote|branch.
*.pushremote
)
1733 __gitcomp_nl
"$(__git_remotes)"
1737 __gitcomp_nl
"$(__git_refs)"
1741 __gitcomp
"false true"
1745 __gitcomp_nl
"$(__git_remotes)"
1749 local remote
="${prev#remote.}"
1750 remote
="${remote%.fetch}"
1751 if [ -z "$cur" ]; then
1752 __gitcomp_nl
"refs/heads/" "" "" ""
1755 __gitcomp_nl
"$(__git_refs_remotes "$remote")"
1759 local remote
="${prev#remote.}"
1760 remote
="${remote%.push}"
1761 __gitcomp_nl
"$(git --git-dir="$
(__gitdir
)" \
1762 for-each-ref --format='%(refname):%(refname)' \
1766 pull.twohead|pull.octopus
)
1767 __git_compute_merge_strategies
1768 __gitcomp
"$__git_merge_strategies"
1771 color.branch|color.
diff|color.interactive|\
1772 color.showbranch|color.status|color.ui
)
1773 __gitcomp
"always never auto"
1777 __gitcomp
"false true"
1782 normal black red green yellow blue magenta cyan white
1783 bold dim ul blink reverse
1788 __gitcomp
"log short"
1792 __gitcomp
"man info web html"
1796 __gitcomp
"$__git_log_date_formats"
1799 sendemail.aliasesfiletype
)
1800 __gitcomp
"mutt mailrc pine elm gnus"
1804 __gitcomp
"$__git_send_email_confirm_options"
1807 sendemail.suppresscc
)
1808 __gitcomp
"$__git_send_email_suppresscc_options"
1811 --get|
--get-all|
--unset|
--unset-all)
1812 __gitcomp_nl
"$(__git_config_get_set_variables)"
1822 --system --global --local --file=
1823 --list --replace-all
1824 --get --get-all --get-regexp
1825 --add --unset --unset-all
1826 --remove-section --rename-section
1831 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1832 __gitcomp
"remote pushremote merge mergeoptions rebase" "$pfx" "$cur_"
1836 local pfx
="${cur%.*}." cur_
="${cur#*.}"
1837 __gitcomp_nl
"$(__git_heads)" "$pfx" "$cur_" "."
1841 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1843 argprompt cmd confirm needsfile noconsole norescan
1844 prompt revprompt revunmerged title
1849 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1850 __gitcomp
"cmd path" "$pfx" "$cur_"
1854 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1855 __gitcomp
"cmd path" "$pfx" "$cur_"
1859 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1860 __gitcomp
"cmd path trustExitCode" "$pfx" "$cur_"
1864 local pfx
="${cur%.*}." cur_
="${cur#*.}"
1865 __git_compute_all_commands
1866 __gitcomp_nl
"$__git_all_commands" "$pfx" "$cur_"
1870 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1872 url proxy fetch push mirror skipDefaultUpdate
1873 receivepack uploadpack tagopt pushurl
1878 local pfx
="${cur%.*}." cur_
="${cur#*.}"
1879 __gitcomp_nl
"$(__git_remotes)" "$pfx" "$cur_" "."
1883 local pfx
="${cur%.*}." cur_
="${cur##*.}"
1884 __gitcomp
"insteadOf pushInsteadOf" "$pfx" "$cur_"
1890 advice.commitBeforeMerge
1892 advice.implicitIdentity
1893 advice.pushNonFastForward
1894 advice.resolveConflict
1898 apply.ignorewhitespace
1900 branch.autosetupmerge
1901 branch.autosetuprebase
1905 color.branch.current
1910 color.decorate.branch
1911 color.decorate.remoteBranch
1912 color.decorate.stash
1922 color.diff.whitespace
1927 color.grep.linenumber
1930 color.grep.separator
1932 color.interactive.error
1933 color.interactive.header
1934 color.interactive.help
1935 color.interactive.prompt
1940 color.status.changed
1942 color.status.nobranch
1943 color.status.untracked
1944 color.status.updated
1953 core.bigFileThreshold
1956 core.deltaBaseCacheLimit
1961 core.fsyncobjectfiles
1963 core.ignoreCygwinFSTricks
1966 core.logAllRefUpdates
1967 core.loosecompression
1970 core.packedGitWindowSize
1972 core.preferSymlinkRefs
1975 core.repositoryFormatVersion
1977 core.sharedRepository
1981 core.warnAmbiguousRefs
1984 diff.autorefreshindex
1986 diff.ignoreSubmodules
1993 diff.suppressBlankEmpty
1999 fetch.recurseSubmodules
2008 format.subjectprefix
2019 gc.reflogexpireunreachable
2023 gitcvs.commitmsgannotation
2024 gitcvs.dbTableNamePrefix
2035 gui.copyblamethreshold
2039 gui.matchtrackingbranch
2040 gui.newbranchtemplate
2041 gui.pruneduringfetch
2042 gui.spellingdictionary
2057 http.sslCertPasswordProtected
2062 i18n.logOutputEncoding
2068 imap.preformattedHTML
2078 interactive.singlekey
2094 mergetool.keepBackup
2095 mergetool.keepTemporaries
2100 notes.rewrite.rebase
2104 pack.deltaCacheLimit
2120 receive.denyCurrentBranch
2121 receive.denyDeleteCurrent
2123 receive.denyNonFastForwards
2126 receive.updateserverinfo
2129 repack.usedeltabaseoffset
2133 sendemail.aliasesfile
2134 sendemail.aliasfiletype
2138 sendemail.chainreplyto
2140 sendemail.envelopesender
2144 sendemail.signedoffbycc
2145 sendemail.smtpdomain
2146 sendemail.smtpencryption
2148 sendemail.smtpserver
2149 sendemail.smtpserveroption
2150 sendemail.smtpserverport
2152 sendemail.suppresscc
2153 sendemail.suppressfrom
2158 status.relativePaths
2159 status.showUntrackedFiles
2160 status.submodulesummary
2163 transfer.unpackLimit
2175 local subcommands
="add rename remove set-head set-branches set-url show prune update"
2176 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
2177 if [ -z "$subcommand" ]; then
2178 __gitcomp
"$subcommands"
2182 case "$subcommand" in
2183 rename|remove|set-url|show|prune
)
2184 __gitcomp_nl
"$(__git_remotes)"
2186 set-head|set-branches
)
2187 __git_complete_remote_or_refspec
2190 local i c
='' IFS
=$
'\n'
2191 for i
in $
(git
--git-dir="$(__gitdir)" config
--get-regexp "remotes\..*" 2>/dev
/null
); do
2204 __gitcomp_nl
"$(__git_refs)"
2209 __git_has_doubledash
&& return
2213 __gitcomp
"--merge --mixed --hard --soft --patch"
2217 __gitcomp_nl
"$(__git_refs)"
2224 __gitcomp
"--edit --mainline --no-edit --no-commit --signoff"
2228 __gitcomp_nl
"$(__git_refs)"
2235 __gitcomp
"--cached --dry-run --ignore-unmatch --quiet"
2240 __git_complete_index_file
"--cached"
2245 __git_has_doubledash
&& return
2250 $__git_log_common_options
2251 $__git_log_shortlog_options
2252 --numbered --summary
2257 __git_complete_revlist
2262 __git_has_doubledash
&& return
2265 --pretty=*|
--format=*)
2266 __gitcomp
"$__git_log_pretty_formats $(__git_pretty_aliases)
2271 __gitcomp
"$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
2275 __gitcomp
"--pretty= --format= --abbrev-commit --oneline
2276 $__git_diff_common_options
2281 __git_complete_revlist_file
2289 --all --remotes --topo-order --current --more=
2290 --list --independent --merge-base --no-name
2292 --sha1-name --sparse --topics --reflog
2297 __git_complete_revlist
2302 local save_opts
='--keep-index --no-keep-index --quiet --patch'
2303 local subcommands
='save list show apply clear drop pop create branch'
2304 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
2305 if [ -z "$subcommand" ]; then
2308 __gitcomp
"$save_opts"
2311 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2312 __gitcomp
"$subcommands"
2317 case "$subcommand,$cur" in
2319 __gitcomp
"$save_opts"
2322 __gitcomp
"--index --quiet"
2324 show
,--*|drop
,--*|branch
,--*)
2326 show
,*|apply
,*|drop
,*|pop
,*|branch
,*)
2327 __gitcomp_nl
"$(git --git-dir="$
(__gitdir
)" stash list \
2328 | sed -n -e 's/:.*//p')"
2338 __git_has_doubledash
&& return
2340 local subcommands
="add status init deinit update summary foreach sync"
2341 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2344 __gitcomp
"--quiet --cached"
2347 __gitcomp
"$subcommands"
2357 init fetch clone rebase dcommit log find-rev
2358 set-tree commit-diff info create-ignore propget
2359 proplist show-ignore show-externals branch tag blame
2360 migrate mkdirs reset gc
2362 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
2363 if [ -z "$subcommand" ]; then
2364 __gitcomp
"$subcommands"
2366 local remote_opts
="--username= --config-dir= --no-auth-cache"
2368 --follow-parent --authors-file= --repack=
2369 --no-metadata --use-svm-props --use-svnsync-props
2370 --log-window-size= --no-checkout --quiet
2371 --repack-flags --use-log-author --localtime
2372 --ignore-paths= --include-paths= $remote_opts
2375 --template= --shared= --trunk= --tags=
2376 --branches= --stdlayout --minimize-url
2377 --no-metadata --use-svm-props --use-svnsync-props
2378 --rewrite-root= --prefix= --use-log-author
2379 --add-author-from $remote_opts
2382 --edit --rmdir --find-copies-harder --copy-similarity=
2385 case "$subcommand,$cur" in
2387 __gitcomp
"--revision= --fetch-all $fc_opts"
2390 __gitcomp
"--revision= $fc_opts $init_opts"
2393 __gitcomp
"$init_opts"
2397 --merge --strategy= --verbose --dry-run
2398 --fetch-all --no-rebase --commit-url
2399 --revision --interactive $cmt_opts $fc_opts
2403 __gitcomp
"--stdin $cmt_opts $fc_opts"
2405 create-ignore
,--*|propget
,--*|proplist
,--*|show-ignore
,--*|\
2406 show-externals
,--*|mkdirs
,--*)
2407 __gitcomp
"--revision="
2411 --limit= --revision= --verbose --incremental
2412 --oneline --show-commit --non-recursive
2413 --authors-file= --color
2418 --merge --verbose --strategy= --local
2419 --fetch-all --dry-run $fc_opts
2423 __gitcomp
"--message= --file= --revision= $cmt_opts"
2429 __gitcomp
"--dry-run --message --tag"
2432 __gitcomp
"--dry-run --message"
2435 __gitcomp
"--git-format"
2439 --config-dir= --ignore-paths= --minimize
2440 --no-auth-cache --username=
2444 __gitcomp
"--revision= --parent"
2455 while [ $c -lt $cword ]; do
2459 __gitcomp_nl
"$(__git_tags)"
2474 __gitcomp_nl
"$(__git_tags)"
2478 __gitcomp_nl
"$(__git_refs)"
2490 local i c
=1 command __git_dir
2492 while [ $c -lt $cword ]; do
2495 --git-dir=*) __git_dir
="${i#--git-dir=}" ;;
2496 --bare) __git_dir
="." ;;
2497 --help) command="help"; break ;;
2500 *) command="$i"; break ;;
2505 if [ -z "$command" ]; then
2519 --no-replace-objects
2523 *) __git_compute_porcelain_commands
2524 __gitcomp
"$__git_porcelain_commands $(__git_aliases)" ;;
2529 local completion_func
="_git_${command//-/_}"
2530 declare -f $completion_func >/dev
/null
&& $completion_func && return
2532 local expansion
=$
(__git_aliased_command
"$command")
2533 if [ -n "$expansion" ]; then
2534 completion_func
="_git_${expansion//-/_}"
2535 declare -f $completion_func >/dev
/null
&& $completion_func
2541 __git_has_doubledash
&& return
2543 local g
="$(__gitdir)"
2545 if [ -f "$g/MERGE_HEAD" ]; then
2551 $__git_log_common_options
2552 $__git_log_gitk_options
2558 __git_complete_revlist
2561 if [[ -n ${ZSH_VERSION-} ]]; then
2562 echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
2564 autoload
-U +X compinit
&& compinit
2570 local cur_
="${3-$cur}"
2576 local c IFS
=$
' \t\n'
2587 compadd
-Q -S '' -p "${2-}" -a -- array
&& _ret
=0
2598 compadd
-Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0
2607 compadd -Q -p "${2-}" -f -- ${=1} && _ret=0
2612 local _ret=1 cur cword prev
2613 cur=${words[CURRENT]}
2614 prev=${words[CURRENT-1]}
2616 emulate ksh -c __${service}_main
2617 let _ret && _default && _ret=0
2621 compdef _git git gitk
2627 local cur words cword prev
2628 _get_comp_words_by_ref -n =: cur words cword prev
2632 # Setup completion for certain functions defined above by setting common
2633 # variables and workarounds.
2634 # This is NOT a public function; use at your own risk.
2637 local wrapper="__git_wrap
${2}"
2638 eval "$wrapper () { __git_func_wrap
$2 ; }"
2639 complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \
2640 || complete -o default -o nospace -F $wrapper $1
2643 # wrapper for backwards compatibility
2646 __git_wrap__git_main
2649 # wrapper for backwards compatibility
2652 __git_wrap__gitk_main
2655 __git_complete git __git_main
2656 __git_complete gitk __gitk_main
2658 # The following are necessary only for Cygwin, and only are needed
2659 # when the user has tab-completed the executable name and consequently
2660 # included the '.exe' suffix.
2662 if [ Cygwin = "$
(uname
-o 2>/dev
/null
)" ]; then
2663 __git_complete git.exe __git_main