1 # bash/zsh completion support for core Git.
3 # Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
4 # Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
5 # Distributed under the GNU General Public License, version 2.0.
7 # The contained completion routines provide support for completing:
9 # *) local and remote branch names
10 # *) local and remote tag names
11 # *) .git/remotes file names
12 # *) git 'subcommands'
13 # *) tree paths within 'ref:path/to/file' expressions
14 # *) file paths within current working directory and index
15 # *) common --long-options
17 # To use these routines:
19 # 1) Copy this file to somewhere (e.g. ~/.git-completion.bash).
20 # 2) Add the following line to your .bashrc/.zshrc:
21 # source ~/.git-completion.bash
22 # 3) Consider changing your PS1 to also show the current branch,
23 # see git-prompt.sh for details.
25 # If you use complex aliases of form '!f() { ... }; f', you can use the null
26 # command ':' as the first command in the function body to declare the desired
27 # completion style. For example '!f() { : git commit ; ... }; f' will
28 # tell the completion to use commit completion. This also works with aliases
29 # of form "!sh -c '...'". For example, "!sh -c ': git commit ; ... '".
31 case "$COMP_WORDBREAKS" in
33 *) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
36 # __gitdir accepts 0 or 1 arguments (i.e., location)
37 # returns location of .git repo
40 if [ -z "${1-}" ]; then
41 if [ -n "${__git_dir-}" ]; then
43 elif [ -n "${GIT_DIR-}" ]; then
44 test -d "${GIT_DIR-}" || return 1
46 elif [ -d .git ]; then
49 git rev-parse --git-dir 2>/dev/null
51 elif [ -d "$1/.git" ]; then
58 # The following function is based on code from:
60 # bash_completion - programmable completion functions for bash 3.2+
62 # Copyright © 2006-2008, Ian Macdonald <ian@caliban.org>
63 # © 2009-2010, Bash Completion Maintainers
64 # <bash-completion-devel@lists.alioth.debian.org>
66 # This program is free software; you can redistribute it and/or modify
67 # it under the terms of the GNU General Public License as published by
68 # the Free Software Foundation; either version 2, or (at your option)
71 # This program is distributed in the hope that it will be useful,
72 # but WITHOUT ANY WARRANTY; without even the implied warranty of
73 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
74 # GNU General Public License for more details.
76 # You should have received a copy of the GNU General Public License
77 # along with this program; if not, write to the Free Software Foundation,
78 # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
80 # The latest version of this software can be obtained here:
82 # http://bash-completion.alioth.debian.org/
86 # This function can be used to access a tokenized list of words
87 # on the command line:
89 # __git_reassemble_comp_words_by_ref '=:'
90 # if test "${words_[cword_-1]}" = -w
95 # The argument should be a collection of characters from the list of
96 # word completion separators (COMP_WORDBREAKS) to treat as ordinary
99 # This is roughly equivalent to going back in time and setting
100 # COMP_WORDBREAKS to exclude those characters. The intent is to
101 # make option types like --date=<type> and <rev>:<path> easy to
102 # recognize by treating each shell word as a single token.
104 # It is best not to set COMP_WORDBREAKS directly because the value is
105 # shared with other completion scripts. By the time the completion
106 # function gets called, COMP_WORDS has already been populated so local
107 # changes to COMP_WORDBREAKS have no effect.
109 # Output: words_, cword_, cur_.
111 __git_reassemble_comp_words_by_ref()
113 local exclude i j first
114 # Which word separators to exclude?
115 exclude="${1//[^$COMP_WORDBREAKS]}"
117 if [ -z "$exclude" ]; then
118 words_=("${COMP_WORDS[@]}")
121 # List of word completion separators has shrunk;
122 # re-assemble words to complete.
123 for ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)); do
124 # Append each nonempty word consisting of just
125 # word separator characters to the current word.
129 [ -n "${COMP_WORDS[$i]}" ] &&
130 # word consists of excluded word separators
131 [ "${COMP_WORDS[$i]//[^$exclude]}" = "${COMP_WORDS[$i]}" ]
133 # Attach to the previous token,
134 # unless the previous token is the command name.
135 if [ $j -ge 2 ] && [ -n "$first" ]; then
139 words_[$j]=${words_[j]}${COMP_WORDS[i]}
140 if [ $i = $COMP_CWORD ]; then
143 if (($i < ${#COMP_WORDS[@]} - 1)); then
150 words_[$j]=${words_[j]}${COMP_WORDS[i]}
151 if [ $i = $COMP_CWORD ]; then
157 if ! type _get_comp_words_by_ref >/dev/null 2>&1; then
158 _get_comp_words_by_ref ()
160 local exclude cur_ words_ cword_
161 if [ "$1" = "-n" ]; then
165 __git_reassemble_comp_words_by_ref "$exclude"
166 cur_=${words_[cword_]}
167 while [ $# -gt 0 ]; do
173 prev=${words_[$cword_-1]}
176 words=("${words_[@]}")
189 local i=${#COMPREPLY[@]}
191 if [[ "$x" == "$3"* ]]; then
192 COMPREPLY[i++]="$2$x$4"
203 # Generates completion reply, appending a space to possible completion words,
205 # It accepts 1 to 4 arguments:
206 # 1: List of possible completion words.
207 # 2: A prefix to be added to each possible completion word (optional).
208 # 3: Generate possible completion matches for this word (optional).
209 # 4: A suffix to be appended to each possible completion word (optional).
212 local cur_="${3-$cur}"
218 local c i=0 IFS=$' \t\n'
221 if [[ $c == "$cur_"* ]]; then
226 COMPREPLY[i++]="${2-}$c"
233 # Variation of __gitcomp_nl () that appends to the existing list of
234 # completion candidates, COMPREPLY.
235 __gitcomp_nl_append ()
238 __gitcompappend "$1" "${2-}" "${3-$cur}" "${4- }"
241 # Generates completion reply from newline-separated possible completion words
242 # by appending a space to all of them.
243 # It accepts 1 to 4 arguments:
244 # 1: List of possible completion words, separated by a single newline.
245 # 2: A prefix to be added to each possible completion word (optional).
246 # 3: Generate possible completion matches for this word (optional).
247 # 4: A suffix to be appended to each possible completion word instead of
248 # the default space (optional). If specified but empty, nothing is
253 __gitcomp_nl_append "$@"
256 # Generates completion reply with compgen from newline-separated possible
257 # completion filenames.
258 # It accepts 1 to 3 arguments:
259 # 1: List of possible completion filenames, separated by a single newline.
260 # 2: A directory prefix to be added to each possible completion filename
262 # 3: Generate possible completion matches for this word (optional).
267 # XXX does not work when the directory prefix contains a tilde,
268 # since tilde expansion is not applied.
269 # This means that COMPREPLY will be empty and Bash default
270 # completion will be used.
271 __gitcompadd "$1" "${2-}" "${3-$cur}" ""
273 # use a hack to enable file mode in bash < 4
274 compopt -o filenames +o nospace 2>/dev/null ||
275 compgen -f /non-existing-dir/ > /dev/null
278 # Execute 'git ls-files', unless the --committable option is specified, in
279 # which case it runs 'git diff-index' to find out the files that can be
280 # committed. It return paths relative to the directory specified in the first
281 # argument, and using the options specified in the second argument.
282 __git_ls_files_helper ()
284 if [ "$2" == "--committable" ]; then
285 git -C "$1" diff-index --name-only --relative HEAD
287 # NOTE: $2 is not quoted in order to support multiple options
288 git -C "$1" ls-files --exclude-standard $2
293 # __git_index_files accepts 1 or 2 arguments:
294 # 1: Options to pass to ls-files (required).
295 # 2: A directory path (optional).
296 # If provided, only files within the specified directory are listed.
297 # Sub directories are never recursed. Path must have a trailing
301 local dir="$(__gitdir)" root="${2-.}" file
303 if [ -d "$dir" ]; then
304 __git_ls_files_helper "$root" "$1" |
305 while read -r file; do
307 ?*/*) echo "${file%%/*}" ;;
316 local dir="$(__gitdir)"
317 if [ -d "$dir" ]; then
318 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
326 local dir="$(__gitdir)"
327 if [ -d "$dir" ]; then
328 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
334 # __git_refs accepts 0, 1 (to pass to __gitdir), or 2 arguments
335 # presence of 2nd argument means use the guess heuristic employed
336 # by checkout for tracking branches
339 local i hash dir="$(__gitdir "${1-}")" track="${2-}"
341 if [ -d "$dir" ]; then
349 for i in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD; do
350 if [ -e "$dir/$i" ]; then echo $i; fi
352 format="refname:short"
353 refs="refs/tags refs/heads refs/remotes"
356 git --git-dir="$dir" for-each-ref --format="%($format)" \
358 if [ -n "$track" ]; then
359 # employ the heuristic used by git checkout
360 # Try to find a remote branch that matches the completion word
361 # but only output if the branch name is unique
363 git --git-dir="$dir" for-each-ref --shell --format="ref=%(refname:short)" \
365 while read -r entry; do
368 if [[ "$ref" == "$cur"* ]]; then
371 done | sort | uniq -u
377 git ls-remote "$dir" "$cur*" 2>/dev/null | \
378 while read -r hash i; do
387 git for-each-ref --format="%(refname:short)" -- \
388 "refs/remotes/$dir/" 2>/dev/null | sed -e "s#^$dir/##"
393 # __git_refs2 requires 1 argument (to pass to __git_refs)
397 for i in $(__git_refs "$1"); do
402 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
403 __git_refs_remotes ()
406 git ls-remote "$1" 'refs/heads/*' 2>/dev/null | \
407 while read -r hash i; do
408 echo "$i:refs/remotes/$1/${i#refs/heads/}"
414 local i IFS=$'\n' d="$(__gitdir)"
415 test -d "$d/remotes" && ls -1 "$d/remotes"
416 for i in $(git --git-dir="$d" config --get-regexp 'remote\..*\.url' 2>/dev/null); do
422 __git_list_merge_strategies ()
424 git merge -s help 2>&1 |
425 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
434 __git_merge_strategies=
435 # 'git merge -s help' (and thus detection of the merge strategy
436 # list) fails, unfortunately, if run outside of any git working
437 # tree. __git_merge_strategies is set to the empty string in
438 # that case, and the detection will be repeated the next time it
440 __git_compute_merge_strategies ()
442 test -n "$__git_merge_strategies" ||
443 __git_merge_strategies=$(__git_list_merge_strategies)
446 __git_complete_revlist_file ()
448 local pfx ls ref cur_="$cur"
468 case "$COMP_WORDBREAKS" in
470 *) pfx="$ref:$pfx" ;;
473 __gitcomp_nl "$(git --git-dir="$(__gitdir)" ls-tree "$ls" 2>/dev/null \
474 | sed '/^100... blob /{
490 pfx="${cur_%...*}..."
492 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
497 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
500 __gitcomp_nl "$(__git_refs)"
506 # __git_complete_index_file requires 1 argument:
507 # 1: the options to pass to ls-file
509 # The exception is --committable, which finds the files appropriate commit.
510 __git_complete_index_file ()
512 local pfx="" cur_="$cur"
522 __gitcomp_file "$(__git_index_files "$1" ${pfx:+"$pfx"})" "$pfx" "$cur_"
525 __git_complete_file ()
527 __git_complete_revlist_file
530 __git_complete_revlist ()
532 __git_complete_revlist_file
535 __git_complete_remote_or_refspec ()
537 local cur_="$cur" cmd="${words[1]}"
538 local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0
539 if [ "$cmd" = "remote" ]; then
542 while [ $c -lt $cword ]; do
545 --mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
548 push) no_complete_refspec=1 ;;
556 *) remote="$i"; break ;;
560 if [ -z "$remote" ]; then
561 __gitcomp_nl "$(__git_remotes)"
564 if [ $no_complete_refspec = 1 ]; then
567 [ "$remote" = "." ] && remote=
570 case "$COMP_WORDBREAKS" in
572 *) pfx="${cur_%%:*}:" ;;
584 if [ $lhs = 1 ]; then
585 __gitcomp_nl "$(__git_refs2 "$remote")" "$pfx" "$cur_"
587 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
591 if [ $lhs = 1 ]; then
592 __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
594 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
598 if [ $lhs = 1 ]; then
599 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
601 __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
607 __git_complete_strategy ()
609 __git_compute_merge_strategies
612 __gitcomp "$__git_merge_strategies"
617 __gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}"
625 if test -n "${GIT_TESTING_COMMAND_COMPLETION:-}"
627 printf "%s" "${GIT_TESTING_COMMAND_COMPLETION}"
629 git help -a|egrep '^ [a-zA-Z0-9]'
633 __git_list_all_commands ()
636 for i in $(__git_commands)
639 *--*) : helper pattern;;
646 __git_compute_all_commands ()
648 test -n "$__git_all_commands" ||
649 __git_all_commands=$(__git_list_all_commands)
652 __git_list_porcelain_commands ()
655 __git_compute_all_commands
656 for i in $__git_all_commands
659 *--*) : helper pattern;;
660 applymbox) : ask gittus;;
661 applypatch) : ask gittus;;
662 archimport) : import;;
663 cat-file) : plumbing;;
664 check-attr) : plumbing;;
665 check-ignore) : plumbing;;
666 check-mailmap) : plumbing;;
667 check-ref-format) : plumbing;;
668 checkout-index) : plumbing;;
669 commit-tree) : plumbing;;
670 count-objects) : infrequent;;
671 credential-cache) : credentials helper;;
672 credential-store) : credentials helper;;
673 cvsexportcommit) : export;;
674 cvsimport) : import;;
675 cvsserver) : daemon;;
677 diff-files) : plumbing;;
678 diff-index) : plumbing;;
679 diff-tree) : plumbing;;
680 fast-import) : import;;
681 fast-export) : export;;
682 fsck-objects) : plumbing;;
683 fetch-pack) : plumbing;;
684 fmt-merge-msg) : plumbing;;
685 for-each-ref) : plumbing;;
686 hash-object) : plumbing;;
687 http-*) : transport;;
688 index-pack) : plumbing;;
689 init-db) : deprecated;;
690 local-fetch) : plumbing;;
691 ls-files) : plumbing;;
692 ls-remote) : plumbing;;
693 ls-tree) : plumbing;;
694 mailinfo) : plumbing;;
695 mailsplit) : plumbing;;
696 merge-*) : plumbing;;
699 pack-objects) : plumbing;;
700 pack-redundant) : plumbing;;
701 pack-refs) : plumbing;;
702 parse-remote) : plumbing;;
703 patch-id) : plumbing;;
705 prune-packed) : plumbing;;
706 quiltimport) : import;;
707 read-tree) : plumbing;;
708 receive-pack) : plumbing;;
709 remote-*) : transport;;
711 rev-list) : plumbing;;
712 rev-parse) : plumbing;;
713 runstatus) : plumbing;;
714 sh-setup) : internal;;
716 show-ref) : plumbing;;
717 send-pack) : plumbing;;
718 show-index) : plumbing;;
720 stripspace) : plumbing;;
721 symbolic-ref) : plumbing;;
722 unpack-file) : plumbing;;
723 unpack-objects) : plumbing;;
724 update-index) : plumbing;;
725 update-ref) : plumbing;;
726 update-server-info) : daemon;;
727 upload-archive) : plumbing;;
728 upload-pack) : plumbing;;
729 write-tree) : plumbing;;
731 verify-pack) : infrequent;;
732 verify-tag) : plumbing;;
738 __git_porcelain_commands=
739 __git_compute_porcelain_commands ()
741 __git_compute_all_commands
742 test -n "$__git_porcelain_commands" ||
743 __git_porcelain_commands=$(__git_list_porcelain_commands)
746 __git_pretty_aliases ()
749 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "pretty\..*" 2>/dev/null); do
762 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "alias\..*" 2>/dev/null); do
772 # __git_aliased_command requires 1 argument
773 __git_aliased_command ()
775 local word cmdline=$(git --git-dir="$(__gitdir)" \
776 config --get "alias.$1")
777 for word in $cmdline; do
783 \!*) : shell command alias ;;
785 *=*) : setting env ;;
787 \(\)) : skip parens of shell function definition ;;
788 {) : skip start of shell helper function ;;
789 :) : skip null command ;;
790 \'*) : skip opening quote after sh -c ;;
798 # __git_find_on_cmdline requires 1 argument
799 __git_find_on_cmdline ()
801 local word subcommand c=1
802 while [ $c -lt $cword ]; do
804 for subcommand in $1; do
805 if [ "$subcommand" = "$word" ]; then
814 __git_has_doubledash ()
817 while [ $c -lt $cword ]; do
818 if [ "--" = "${words[c]}" ]; then
826 # Try to count non option arguments passed on the command line for the
827 # specified git command.
828 # When options are used, it is necessary to use the special -- option to
829 # tell the implementation were non option arguments begin.
830 # XXX this can not be improved, since options can appear everywhere, as
834 # __git_count_arguments requires 1 argument: the git command executed.
835 __git_count_arguments ()
839 # Skip "git" (first argument)
840 for ((i=1; i < ${#words[@]}; i++)); do
845 # Good; we can assume that the following are only non
850 # Skip the specified git command and discard git
863 __git_whitespacelist="nowarn warn error error-all fix"
867 local dir="$(__gitdir)"
868 if [ -d "$dir"/rebase-apply ]; then
869 __gitcomp "--skip --continue --resolved --abort"
874 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
879 --3way --committer-date-is-author-date --ignore-date
880 --ignore-whitespace --ignore-space-change
881 --interactive --keep --no-utf8 --signoff --utf8
882 --whitespace= --scissors
892 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
897 --stat --numstat --summary --check --index
898 --cached --index-info --reverse --reject --unidiff-zero
899 --apply --no-add --exclude= --staged
900 --ignore-whitespace --ignore-space-change
901 --whitespace= --inaccurate-eof --verbose
912 --interactive --refresh --patch --update --dry-run
913 --ignore-errors --intent-to-add
918 # XXX should we check for --update and --all options ?
919 __git_complete_index_file "--others --modified --directory --no-empty-directory"
926 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
930 __gitcomp_nl "$(__git_remotes)" "" "${cur##--remote=}"
935 --format= --list --verbose
936 --prefix= --remote= --exec=
946 __git_has_doubledash && return
948 local subcommands="start bad good skip reset visualize replay log run"
949 local subcommand="$(__git_find_on_cmdline "$subcommands")"
950 if [ -z "$subcommand" ]; then
951 if [ -f "$(__gitdir)"/BISECT_START ]; then
952 __gitcomp "$subcommands"
954 __gitcomp "replay start"
959 case "$subcommand" in
960 bad|good|reset|skip|start)
961 __gitcomp_nl "$(__git_refs)"
970 local i c=1 only_local_ref="n" has_r="n"
972 while [ $c -lt $cword ]; do
975 -d|-m) only_local_ref="y" ;;
983 __gitcomp "$(__git_refs)" "" "${cur##--set-upstream-to=}"
987 --color --no-color --verbose --abbrev= --no-abbrev
988 --track --no-track --contains --merged --no-merged
989 --set-upstream-to= --edit-description --list
994 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
995 __gitcomp_nl "$(__git_heads)"
997 __gitcomp_nl "$(__git_refs)"
1005 local cmd="${words[2]}"
1008 __gitcomp "create list-heads verify unbundle"
1011 # looking for a file
1016 __git_complete_revlist
1025 __git_has_doubledash && return
1029 __gitcomp "diff3 merge" "" "${cur##--conflict=}"
1033 --quiet --ours --theirs --track --no-track --merge
1034 --conflict= --orphan --patch
1038 # check if --track, --no-track, or --no-guess was specified
1039 # if so, disable DWIM mode
1040 local flags="--track --no-track --no-guess" track=1
1041 if [ -n "$(__git_find_on_cmdline "$flags")" ]; then
1044 __gitcomp_nl "$(__git_refs '' $track)"
1051 __gitcomp "$(__git_refs)"
1056 local dir="$(__gitdir)"
1057 if [ -f "$dir"/CHERRY_PICK_HEAD ]; then
1058 __gitcomp "--continue --quit --abort"
1063 __gitcomp "--edit --no-commit --signoff --strategy= --mainline"
1066 __gitcomp_nl "$(__git_refs)"
1075 __gitcomp "--dry-run --quiet"
1080 # XXX should we check for -x option ?
1081 __git_complete_index_file "--others --directory"
1113 __gitcomp_nl "$(__git_refs)" "" "${cur}"
1120 __gitcomp "default strip verbatim whitespace
1121 " "" "${cur##--cleanup=}"
1124 --reuse-message=*|--reedit-message=*|\
1125 --fixup=*|--squash=*)
1126 __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1129 --untracked-files=*)
1130 __gitcomp "all no normal" "" "${cur##--untracked-files=}"
1135 --all --author= --signoff --verify --no-verify
1137 --amend --include --only --interactive
1138 --dry-run --reuse-message= --reedit-message=
1139 --reset-author --file= --message= --template=
1140 --cleanup= --untracked-files --untracked-files=
1141 --verbose --quiet --fixup= --squash=
1146 if git rev-parse --verify --quiet HEAD >/dev/null; then
1147 __git_complete_index_file "--committable"
1149 # This is the first commit
1150 __git_complete_index_file "--cached"
1159 --all --tags --contains --abbrev= --candidates=
1160 --exact-match --debug --long --match --always
1164 __gitcomp_nl "$(__git_refs)"
1167 __git_diff_algorithms="myers minimal patience histogram"
1169 __git_diff_common_options="--stat --numstat --shortstat --summary
1170 --patch-with-stat --name-only --name-status --color
1171 --no-color --color-words --no-renames --check
1172 --full-index --binary --abbrev --diff-filter=
1173 --find-copies-harder
1174 --text --ignore-space-at-eol --ignore-space-change
1175 --ignore-all-space --ignore-blank-lines --exit-code
1176 --quiet --ext-diff --no-ext-diff
1177 --no-prefix --src-prefix= --dst-prefix=
1178 --inter-hunk-context=
1179 --patience --histogram --minimal
1181 --dirstat --dirstat= --dirstat-by-file
1182 --dirstat-by-file= --cumulative
1188 __git_has_doubledash && return
1192 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
1196 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1197 --base --ours --theirs --no-index
1198 $__git_diff_common_options
1203 __git_complete_revlist_file
1206 __git_mergetools_common="diffuse diffmerge ecmerge emerge kdiff3 meld opendiff
1207 tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc codecompare
1212 __git_has_doubledash && return
1216 __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
1220 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1221 --base --ours --theirs
1222 --no-renames --diff-filter= --find-copies-harder
1223 --relative --ignore-submodules
1228 __git_complete_revlist_file
1231 __git_fetch_recurse_submodules="yes on-demand no"
1233 __git_fetch_options="
1234 --quiet --verbose --append --upload-pack --force --keep --depth=
1235 --tags --no-tags --all --prune --dry-run --recurse-submodules=
1236 --no-recurse-submodules --unshallow --update-shallow --multiple
1237 --submodule-prefix= --update-head-ok --progress
1243 --recurse-submodules=*)
1244 __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
1248 __gitcomp "$__git_fetch_options"
1252 __git_complete_remote_or_refspec
1255 __git_format_patch_options="
1256 --stdout --attach --no-attach --thread --thread= --no-thread
1257 --numbered --start-number --numbered-files --keep-subject --signoff
1258 --signature --no-signature --in-reply-to= --cc= --full-index --binary
1259 --not --all --cover-letter --no-prefix --src-prefix= --dst-prefix=
1260 --inline --suffix= --ignore-if-in-upstream --subject-prefix=
1261 --output-directory --reroll-count --to= --quiet --notes
1264 _git_format_patch ()
1270 " "" "${cur##--thread=}"
1274 __gitcomp "$__git_format_patch_options"
1278 __git_complete_revlist
1286 --tags --root --unreachable --cache --no-reflogs --full
1287 --strict --verbose --lost-found
1298 __gitcomp "--prune --aggressive"
1309 __git_match_ctag() {
1310 awk "/^${1////\\/}/ { print \$1 }" "$2"
1315 __git_has_doubledash && return
1321 --text --ignore-case --word-regexp --invert-match
1322 --full-name --line-number
1323 --extended-regexp --basic-regexp --fixed-strings
1325 --files-with-matches --name-only
1326 --files-without-match
1329 --and --or --not --all-match
1335 case "$cword,$prev" in
1337 if test -r tags; then
1338 __gitcomp_nl "$(__git_match_ctag "$cur" tags)"
1344 __gitcomp_nl "$(__git_refs)"
1351 __gitcomp "--all --info --man --web"
1355 __git_compute_all_commands
1356 __gitcomp "$__git_all_commands $(__git_aliases)
1357 attributes cli core-tutorial cvs-migration
1358 diffcore gitk glossary hooks ignore modules
1359 namespaces repository-layout tutorial tutorial-2
1369 false true umask group all world everybody
1370 " "" "${cur##--shared=}"
1374 __gitcomp "--quiet --bare --template= --shared --shared="
1384 __gitcomp "--cached --deleted --modified --others --ignored
1385 --stage --directory --no-empty-directory --unmerged
1386 --killed --exclude= --exclude-from=
1387 --exclude-per-directory= --exclude-standard
1388 --error-unmatch --with-tree= --full-name
1389 --abbrev --ignored --exclude-per-directory
1395 # XXX ignore options like --modified and always suggest all cached
1397 __git_complete_index_file "--cached"
1402 __gitcomp_nl "$(__git_remotes)"
1410 # Options that go well for log, shortlog and gitk
1411 __git_log_common_options="
1413 --branches --tags --remotes
1414 --first-parent --merges --no-merges
1416 --max-age= --since= --after=
1417 --min-age= --until= --before=
1418 --min-parents= --max-parents=
1419 --no-min-parents --no-max-parents
1421 # Options that go well for log and gitk (not shortlog)
1422 __git_log_gitk_options="
1423 --dense --sparse --full-history
1424 --simplify-merges --simplify-by-decoration
1425 --left-right --notes --no-notes
1427 # Options that go well for log and shortlog (not gitk)
1428 __git_log_shortlog_options="
1429 --author= --committer= --grep=
1433 __git_log_pretty_formats="oneline short medium full fuller email raw format:"
1434 __git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1438 __git_has_doubledash && return
1440 local g="$(git rev-parse --git-dir 2>/dev/null)"
1442 if [ -f "$g/MERGE_HEAD" ]; then
1446 --pretty=*|--format=*)
1447 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
1452 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1456 __gitcomp "long short" "" "${cur##--decorate=}"
1461 $__git_log_common_options
1462 $__git_log_shortlog_options
1463 $__git_log_gitk_options
1464 --root --topo-order --date-order --reverse
1465 --follow --full-diff
1466 --abbrev-commit --abbrev=
1467 --relative-date --date=
1468 --pretty= --format= --oneline
1472 --decorate --decorate=
1474 --parents --children
1476 $__git_diff_common_options
1477 --pickaxe-all --pickaxe-regex
1482 __git_complete_revlist
1485 # Common merge options shared by git-merge(1) and git-pull(1).
1486 __git_merge_options="
1487 --no-commit --no-stat --log --no-log --squash --strategy
1488 --commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit
1489 --verify-signatures --no-verify-signatures --gpg-sign
1490 --quiet --verbose --progress --no-progress
1495 __git_complete_strategy && return
1499 __gitcomp "$__git_merge_options
1500 --rerere-autoupdate --no-rerere-autoupdate --abort"
1503 __gitcomp_nl "$(__git_refs)"
1510 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1524 __gitcomp "--octopus --independent --is-ancestor --fork-point"
1528 __gitcomp_nl "$(__git_refs)"
1535 __gitcomp "--dry-run"
1540 if [ $(__git_count_arguments "mv") -gt 0 ]; then
1541 # We need to show both cached and untracked files (including
1542 # empty directories) since this may not be the last argument.
1543 __git_complete_index_file "--cached --others --directory"
1545 __git_complete_index_file "--cached"
1551 __gitcomp "--tags --all --stdin"
1556 local subcommands='add append copy edit list prune remove show'
1557 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1559 case "$subcommand,$cur" in
1566 __gitcomp_nl "$(__git_refs)"
1569 __gitcomp "$subcommands --ref"
1573 add,--reuse-message=*|append,--reuse-message=*|\
1574 add,--reedit-message=*|append,--reedit-message=*)
1575 __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1578 __gitcomp '--file= --message= --reedit-message=
1585 __gitcomp '--dry-run --verbose'
1594 __gitcomp_nl "$(__git_refs)"
1603 __git_complete_strategy && return
1606 --recurse-submodules=*)
1607 __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
1612 --rebase --no-rebase
1613 $__git_merge_options
1614 $__git_fetch_options
1619 __git_complete_remote_or_refspec
1622 __git_push_recurse_submodules="check on-demand"
1624 __git_complete_force_with_lease ()
1632 __gitcomp_nl "$(__git_refs)" "" "${cur_#*:}"
1635 __gitcomp_nl "$(__git_refs)" "" "$cur_"
1644 __gitcomp_nl "$(__git_remotes)"
1647 --recurse-submodules)
1648 __gitcomp "$__git_push_recurse_submodules"
1654 __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}"
1657 --recurse-submodules=*)
1658 __gitcomp "$__git_push_recurse_submodules" "" "${cur##--recurse-submodules=}"
1661 --force-with-lease=*)
1662 __git_complete_force_with_lease "${cur##--force-with-lease=}"
1667 --all --mirror --tags --dry-run --force --verbose
1668 --quiet --prune --delete --follow-tags
1669 --receive-pack= --repo= --set-upstream
1670 --force-with-lease --force-with-lease= --recurse-submodules=
1675 __git_complete_remote_or_refspec
1680 local dir="$(__gitdir)"
1681 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1682 __gitcomp "--continue --skip --abort"
1685 __git_complete_strategy && return
1688 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1693 --onto --merge --strategy --interactive
1694 --preserve-merges --stat --no-stat
1695 --committer-date-is-author-date --ignore-date
1696 --ignore-whitespace --whitespace=
1697 --autosquash --fork-point --no-fork-point
1703 __gitcomp_nl "$(__git_refs)"
1708 local subcommands="show delete expire"
1709 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1711 if [ -z "$subcommand" ]; then
1712 __gitcomp "$subcommands"
1714 __gitcomp_nl "$(__git_refs)"
1718 __git_send_email_confirm_options="always never auto cc compose"
1719 __git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
1726 $__git_send_email_confirm_options
1727 " "" "${cur##--confirm=}"
1732 $__git_send_email_suppresscc_options
1733 " "" "${cur##--suppress-cc=}"
1737 --smtp-encryption=*)
1738 __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1744 " "" "${cur##--thread=}"
1748 __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1749 --compose --confirm= --dry-run --envelope-sender
1751 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1752 --no-suppress-from --no-thread --quiet
1753 --signed-off-by-cc --smtp-pass --smtp-server
1754 --smtp-server-port --smtp-encryption= --smtp-user
1755 --subject --suppress-cc= --suppress-from --thread --to
1756 --validate --no-validate
1757 $__git_format_patch_options"
1761 __git_complete_revlist
1766 __git_has_doubledash && return
1768 local subcommands="add reset diff rm apply edit"
1769 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1770 if [ -z "$subcommand" ]; then
1771 __gitcomp "$subcommands"
1775 case "$subcommand" in
1793 __git_config_get_set_variables ()
1795 local prevword word config_file= c=$cword
1796 while [ $c -gt 1 ]; do
1799 --system|--global|--local|--file=*)
1804 config_file="$word $prevword"
1812 git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null |
1826 branch.*.remote|branch.*.pushremote)
1827 __gitcomp_nl "$(__git_remotes)"
1831 __gitcomp_nl "$(__git_refs)"
1835 __gitcomp "false true"
1839 __gitcomp_nl "$(__git_remotes)"
1843 local remote="${prev#remote.}"
1844 remote="${remote%.fetch}"
1845 if [ -z "$cur" ]; then
1846 __gitcomp_nl "refs/heads/" "" "" ""
1849 __gitcomp_nl "$(__git_refs_remotes "$remote")"
1853 local remote="${prev#remote.}"
1854 remote="${remote%.push}"
1855 __gitcomp_nl "$(git --git-dir="$(__gitdir)" \
1856 for-each-ref --format='%(refname):%(refname)' \
1860 pull.twohead|pull.octopus)
1861 __git_compute_merge_strategies
1862 __gitcomp "$__git_merge_strategies"
1865 color.branch|color.diff|color.interactive|\
1866 color.showbranch|color.status|color.ui)
1867 __gitcomp "always never auto"
1871 __gitcomp "false true"
1876 normal black red green yellow blue magenta cyan white
1877 bold dim ul blink reverse
1882 __gitcomp "log short"
1886 __gitcomp "man info web html"
1890 __gitcomp "$__git_log_date_formats"
1893 sendemail.aliasesfiletype)
1894 __gitcomp "mutt mailrc pine elm gnus"
1898 __gitcomp "$__git_send_email_confirm_options"
1901 sendemail.suppresscc)
1902 __gitcomp "$__git_send_email_suppresscc_options"
1905 sendemail.transferencoding)
1906 __gitcomp "7bit 8bit quoted-printable base64"
1909 --get|--get-all|--unset|--unset-all)
1910 __gitcomp_nl "$(__git_config_get_set_variables)"
1920 --system --global --local --file=
1921 --list --replace-all
1922 --get --get-all --get-regexp
1923 --add --unset --unset-all
1924 --remove-section --rename-section
1929 local pfx="${cur%.*}." cur_="${cur##*.}"
1930 __gitcomp "remote pushremote merge mergeoptions rebase" "$pfx" "$cur_"
1934 local pfx="${cur%.*}." cur_="${cur#*.}"
1935 __gitcomp_nl "$(__git_heads)" "$pfx" "$cur_" "."
1936 __gitcomp_nl_append $'autosetupmerge\nautosetuprebase\n' "$pfx" "$cur_"
1940 local pfx="${cur%.*}." cur_="${cur##*.}"
1942 argprompt cmd confirm needsfile noconsole norescan
1943 prompt revprompt revunmerged title
1948 local pfx="${cur%.*}." cur_="${cur##*.}"
1949 __gitcomp "cmd path" "$pfx" "$cur_"
1953 local pfx="${cur%.*}." cur_="${cur##*.}"
1954 __gitcomp "cmd path" "$pfx" "$cur_"
1958 local pfx="${cur%.*}." cur_="${cur##*.}"
1959 __gitcomp "cmd path trustExitCode" "$pfx" "$cur_"
1963 local pfx="${cur%.*}." cur_="${cur#*.}"
1964 __git_compute_all_commands
1965 __gitcomp_nl "$__git_all_commands" "$pfx" "$cur_"
1969 local pfx="${cur%.*}." cur_="${cur##*.}"
1971 url proxy fetch push mirror skipDefaultUpdate
1972 receivepack uploadpack tagopt pushurl
1977 local pfx="${cur%.*}." cur_="${cur#*.}"
1978 __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
1979 __gitcomp_nl_append "pushdefault" "$pfx" "$cur_"
1983 local pfx="${cur%.*}." cur_="${cur##*.}"
1984 __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_"
1990 advice.commitBeforeMerge
1992 advice.implicitIdentity
1993 advice.pushNonFastForward
1994 advice.resolveConflict
1998 apply.ignorewhitespace
2000 branch.autosetupmerge
2001 branch.autosetuprebase
2005 color.branch.current
2010 color.decorate.branch
2011 color.decorate.remoteBranch
2012 color.decorate.stash
2022 color.diff.whitespace
2027 color.grep.linenumber
2030 color.grep.separator
2032 color.interactive.error
2033 color.interactive.header
2034 color.interactive.help
2035 color.interactive.prompt
2040 color.status.changed
2042 color.status.nobranch
2043 color.status.untracked
2044 color.status.updated
2053 core.bigFileThreshold
2056 core.deltaBaseCacheLimit
2061 core.fsyncobjectfiles
2065 core.logAllRefUpdates
2066 core.loosecompression
2069 core.packedGitWindowSize
2071 core.preferSymlinkRefs
2074 core.repositoryFormatVersion
2076 core.sharedRepository
2080 core.warnAmbiguousRefs
2083 diff.autorefreshindex
2085 diff.ignoreSubmodules
2092 diff.suppressBlankEmpty
2098 fetch.recurseSubmodules
2108 format.subjectprefix
2119 gc.reflogexpireunreachable
2123 gitcvs.commitmsgannotation
2124 gitcvs.dbTableNamePrefix
2135 gui.copyblamethreshold
2139 gui.matchtrackingbranch
2140 gui.newbranchtemplate
2141 gui.pruneduringfetch
2142 gui.spellingdictionary
2157 http.sslCertPasswordProtected
2162 i18n.logOutputEncoding
2168 imap.preformattedHTML
2178 interactive.singlekey
2194 mergetool.keepBackup
2195 mergetool.keepTemporaries
2200 notes.rewrite.rebase
2204 pack.deltaCacheLimit
2220 receive.denyCurrentBranch
2221 receive.denyDeleteCurrent
2223 receive.denyNonFastForwards
2226 receive.updateserverinfo
2229 repack.usedeltabaseoffset
2233 sendemail.aliasesfile
2234 sendemail.aliasfiletype
2238 sendemail.chainreplyto
2240 sendemail.envelopesender
2244 sendemail.signedoffbycc
2245 sendemail.smtpdomain
2246 sendemail.smtpencryption
2248 sendemail.smtpserver
2249 sendemail.smtpserveroption
2250 sendemail.smtpserverport
2252 sendemail.suppresscc
2253 sendemail.suppressfrom
2258 status.relativePaths
2259 status.showUntrackedFiles
2260 status.submodulesummary
2263 transfer.unpackLimit
2275 local subcommands="add rename remove set-head set-branches set-url show prune update"
2276 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2277 if [ -z "$subcommand" ]; then
2278 __gitcomp "$subcommands"
2282 case "$subcommand" in
2283 rename|remove|set-url|show|prune)
2284 __gitcomp_nl "$(__git_remotes)"
2286 set-head|set-branches)
2287 __git_complete_remote_or_refspec
2290 local i c='' IFS=$'\n'
2291 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "remotes\..*" 2>/dev/null); do
2304 __gitcomp_nl "$(__git_refs)"
2309 __git_has_doubledash && return
2313 __gitcomp "--merge --mixed --hard --soft --patch --keep --merge
2314 --stage --no-stage --work --no-work"
2318 __gitcomp_nl "$(__git_refs)"
2325 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
2329 __gitcomp_nl "$(__git_refs)"
2336 __gitcomp "--cached --staged --dry-run --ignore-unmatch --quiet"
2341 __git_complete_index_file "--cached"
2346 __git_has_doubledash && return
2351 $__git_log_common_options
2352 $__git_log_shortlog_options
2353 --numbered --summary
2358 __git_complete_revlist
2363 __git_has_doubledash && return
2366 --pretty=*|--format=*)
2367 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
2372 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
2376 __gitcomp "--pretty= --format= --abbrev-commit --oneline
2378 $__git_diff_common_options
2383 __git_complete_revlist_file
2391 --all --remotes --topo-order --current --more=
2392 --list --independent --merge-base --no-name
2394 --sha1-name --sparse --topics --reflog
2399 __git_complete_revlist
2404 local save_opts='--keep-index --no-keep-index --stage --no-stage --quiet --patch'
2405 local subcommands='save list show apply clear drop pop create branch'
2406 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2407 if [ -z "$subcommand" ]; then
2410 __gitcomp "$save_opts"
2413 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2414 __gitcomp "$subcommands"
2419 case "$subcommand,$cur" in
2421 __gitcomp "$save_opts"
2424 __gitcomp "--index --stage --quiet"
2426 show,--*|drop,--*|branch,--*)
2428 show,*|apply,*|drop,*|pop,*|branch,*)
2429 __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
2430 | sed -n -e 's/:.*//p')"
2440 __git_has_doubledash && return
2442 local subcommands="add status init deinit update summary foreach sync"
2443 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2446 __gitcomp "--quiet --cached"
2449 __gitcomp "$subcommands"
2459 init fetch clone rebase dcommit log find-rev
2460 set-tree commit-diff info create-ignore propget
2461 proplist show-ignore show-externals branch tag blame
2462 migrate mkdirs reset gc
2464 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2465 if [ -z "$subcommand" ]; then
2466 __gitcomp "$subcommands"
2468 local remote_opts="--username= --config-dir= --no-auth-cache"
2470 --follow-parent --authors-file= --repack=
2471 --no-metadata --use-svm-props --use-svnsync-props
2472 --log-window-size= --no-checkout --quiet
2473 --repack-flags --use-log-author --localtime
2474 --ignore-paths= --include-paths= $remote_opts
2477 --template= --shared= --trunk= --tags=
2478 --branches= --stdlayout --minimize-url
2479 --no-metadata --use-svm-props --use-svnsync-props
2480 --rewrite-root= --prefix= --use-log-author
2481 --add-author-from $remote_opts
2484 --edit --rmdir --find-copies-harder --copy-similarity=
2487 case "$subcommand,$cur" in
2489 __gitcomp "--revision= --fetch-all $fc_opts"
2492 __gitcomp "--revision= $fc_opts $init_opts"
2495 __gitcomp "$init_opts"
2499 --merge --strategy= --verbose --dry-run
2500 --fetch-all --no-rebase --commit-url
2501 --revision --interactive $cmt_opts $fc_opts
2505 __gitcomp "--stdin $cmt_opts $fc_opts"
2507 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
2508 show-externals,--*|mkdirs,--*)
2509 __gitcomp "--revision="
2513 --limit= --revision= --verbose --incremental
2514 --oneline --show-commit --non-recursive
2515 --authors-file= --color
2520 --merge --verbose --strategy= --local
2521 --fetch-all --dry-run $fc_opts
2525 __gitcomp "--message= --file= --revision= $cmt_opts"
2531 __gitcomp "--dry-run --message --tag"
2534 __gitcomp "--dry-run --message"
2537 __gitcomp "--git-format"
2541 --config-dir= --ignore-paths= --minimize
2542 --no-auth-cache --username=
2546 __gitcomp "--revision= --parent"
2557 while [ $c -lt $cword ]; do
2561 __gitcomp_nl "$(__git_tags)"
2576 __gitcomp_nl "$(__git_tags)"
2580 __gitcomp_nl "$(__git_refs)"
2587 --list --delete --verify --annotate --message --file
2588 --sign --cleanup --local-user --force --column --sort
2589 --contains --points-at
2602 local i c=1 command __git_dir
2604 while [ $c -lt $cword ]; do
2607 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2608 --git-dir) ((c++)) ; __git_dir="${words[c]}" ;;
2609 --bare) __git_dir="." ;;
2610 --help) command="help"; break ;;
2611 -c|--work-tree|--namespace) ((c++)) ;;
2613 *) command="$i"; break ;;
2618 if [ -z "$command" ]; then
2633 --no-replace-objects
2637 *) __git_compute_porcelain_commands
2638 __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
2643 local completion_func="_git_${command//-/_}"
2644 declare -f $completion_func >/dev/null && $completion_func && return
2646 local expansion=$(__git_aliased_command "$command")
2647 if [ -n "$expansion" ]; then
2649 completion_func="_git_${expansion//-/_}"
2650 declare -f $completion_func >/dev/null && $completion_func
2656 __git_has_doubledash && return
2658 local g="$(__gitdir)"
2660 if [ -f "$g/MERGE_HEAD" ]; then
2666 $__git_log_common_options
2667 $__git_log_gitk_options
2673 __git_complete_revlist
2678 local cur words cword prev
2679 _get_comp_words_by_ref -n =: cur words cword prev
2683 # Setup completion for certain functions defined above by setting common
2684 # variables and workarounds.
2685 # This is NOT a public function; use at your own risk.
2688 test -n "$ZSH_VERSION" && return
2689 local wrapper="__git_wrap${2}"
2690 eval "$wrapper () { __git_func_wrap $2 ; }"
2691 complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \
2692 || complete -o default -o nospace -F $wrapper $1
2695 __git_complete git __git_main
2696 __git_complete gitk __gitk_main
2698 # The following are necessary only for Cygwin, and only are needed
2699 # when the user has tab-completed the executable name and consequently
2700 # included the '.exe' suffix.
2702 test "$(uname -o 2>/dev/null)" = "Cygwin" &&
2703 __git_complete git.exe __git_main