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.sh).
20 # 2) Add the following line to your .bashrc/.zshrc:
21 # source ~/.git-completion.sh
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 x 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 d="$(__gitdir)"
415 test -d "$d/remotes" && ls -1 "$d/remotes"
416 git --git-dir="$d" remote
419 __git_list_merge_strategies ()
421 git merge -s help 2>&1 |
422 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
431 __git_merge_strategies=
432 # 'git merge -s help' (and thus detection of the merge strategy
433 # list) fails, unfortunately, if run outside of any git working
434 # tree. __git_merge_strategies is set to the empty string in
435 # that case, and the detection will be repeated the next time it
437 __git_compute_merge_strategies ()
439 test -n "$__git_merge_strategies" ||
440 __git_merge_strategies=$(__git_list_merge_strategies)
443 __git_complete_revlist_file ()
445 local pfx ls ref cur_="$cur"
465 case "$COMP_WORDBREAKS" in
467 *) pfx="$ref:$pfx" ;;
470 __gitcomp_nl "$(git --git-dir="$(__gitdir)" ls-tree "$ls" 2>/dev/null \
471 | sed '/^100... blob /{
487 pfx="${cur_%...*}..."
489 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
494 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
497 __gitcomp_nl "$(__git_refs)"
503 # __git_complete_index_file requires 1 argument:
504 # 1: the options to pass to ls-file
506 # The exception is --committable, which finds the files appropriate commit.
507 __git_complete_index_file ()
509 local pfx="" cur_="$cur"
519 __gitcomp_file "$(__git_index_files "$1" ${pfx:+"$pfx"})" "$pfx" "$cur_"
522 __git_complete_file ()
524 __git_complete_revlist_file
527 __git_complete_revlist ()
529 __git_complete_revlist_file
532 __git_complete_remote_or_refspec ()
534 local cur_="$cur" cmd="${words[1]}"
535 local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0
536 if [ "$cmd" = "remote" ]; then
539 while [ $c -lt $cword ]; do
542 --mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
545 push) no_complete_refspec=1 ;;
553 *) remote="$i"; break ;;
557 if [ -z "$remote" ]; then
558 __gitcomp_nl "$(__git_remotes)"
561 if [ $no_complete_refspec = 1 ]; then
564 [ "$remote" = "." ] && remote=
567 case "$COMP_WORDBREAKS" in
569 *) pfx="${cur_%%:*}:" ;;
581 if [ $lhs = 1 ]; then
582 __gitcomp_nl "$(__git_refs2 "$remote")" "$pfx" "$cur_"
584 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
588 if [ $lhs = 1 ]; then
589 __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
591 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
595 if [ $lhs = 1 ]; then
596 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
598 __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
604 __git_complete_strategy ()
606 __git_compute_merge_strategies
609 __gitcomp "$__git_merge_strategies"
614 __gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}"
622 if test -n "${GIT_TESTING_COMMAND_COMPLETION:-}"
624 printf "%s" "${GIT_TESTING_COMMAND_COMPLETION}"
626 git help -a|egrep '^ [a-zA-Z0-9]'
630 __git_list_all_commands ()
633 for i in $(__git_commands)
636 *--*) : helper pattern;;
643 __git_compute_all_commands ()
645 test -n "$__git_all_commands" ||
646 __git_all_commands=$(__git_list_all_commands)
649 __git_list_porcelain_commands ()
652 __git_compute_all_commands
653 for i in $__git_all_commands
656 *--*) : helper pattern;;
657 applymbox) : ask gittus;;
658 applypatch) : ask gittus;;
659 archimport) : import;;
660 cat-file) : plumbing;;
661 check-attr) : plumbing;;
662 check-ignore) : plumbing;;
663 check-mailmap) : plumbing;;
664 check-ref-format) : plumbing;;
665 checkout-index) : plumbing;;
666 commit-tree) : plumbing;;
667 count-objects) : infrequent;;
668 credential) : credentials;;
669 credential-*) : credentials helper;;
670 cvsexportcommit) : export;;
671 cvsimport) : import;;
672 cvsserver) : daemon;;
674 diff-files) : plumbing;;
675 diff-index) : plumbing;;
676 diff-tree) : plumbing;;
677 fast-import) : import;;
678 fast-export) : export;;
679 fsck-objects) : plumbing;;
680 fetch-pack) : plumbing;;
681 fmt-merge-msg) : plumbing;;
682 for-each-ref) : plumbing;;
683 hash-object) : plumbing;;
684 http-*) : transport;;
685 index-pack) : plumbing;;
686 init-db) : deprecated;;
687 local-fetch) : plumbing;;
688 ls-files) : plumbing;;
689 ls-remote) : plumbing;;
690 ls-tree) : plumbing;;
691 mailinfo) : plumbing;;
692 mailsplit) : plumbing;;
693 merge-*) : plumbing;;
696 pack-objects) : plumbing;;
697 pack-redundant) : plumbing;;
698 pack-refs) : plumbing;;
699 parse-remote) : plumbing;;
700 patch-id) : plumbing;;
702 prune-packed) : plumbing;;
703 quiltimport) : import;;
704 read-tree) : plumbing;;
705 receive-pack) : plumbing;;
706 remote-*) : transport;;
708 rev-list) : plumbing;;
709 rev-parse) : plumbing;;
710 runstatus) : plumbing;;
711 sh-setup) : internal;;
713 show-ref) : plumbing;;
714 send-pack) : plumbing;;
715 show-index) : plumbing;;
717 stripspace) : plumbing;;
718 symbolic-ref) : plumbing;;
719 unpack-file) : plumbing;;
720 unpack-objects) : plumbing;;
721 update-index) : plumbing;;
722 update-ref) : plumbing;;
723 update-server-info) : daemon;;
724 upload-archive) : plumbing;;
725 upload-pack) : plumbing;;
726 write-tree) : plumbing;;
728 verify-pack) : infrequent;;
729 verify-tag) : plumbing;;
735 __git_porcelain_commands=
736 __git_compute_porcelain_commands ()
738 test -n "$__git_porcelain_commands" ||
739 __git_porcelain_commands=$(__git_list_porcelain_commands)
742 # Lists all set config variables starting with the given section prefix,
743 # with the prefix removed.
744 __git_get_config_variables ()
746 local section="$1" i IFS=$'\n'
747 for i in $(git --git-dir="$(__gitdir)" config --name-only --get-regexp "^$section\..*" 2>/dev/null); do
748 echo "${i#$section.}"
752 __git_pretty_aliases ()
754 __git_get_config_variables "pretty"
759 __git_get_config_variables "alias"
762 # __git_aliased_command requires 1 argument
763 __git_aliased_command ()
765 local word cmdline=$(git --git-dir="$(__gitdir)" \
766 config --get "alias.$1")
767 for word in $cmdline; do
773 \!*) : shell command alias ;;
775 *=*) : setting env ;;
777 \(\)) : skip parens of shell function definition ;;
778 {) : skip start of shell helper function ;;
779 :) : skip null command ;;
780 \'*) : skip opening quote after sh -c ;;
788 # __git_find_on_cmdline requires 1 argument
789 __git_find_on_cmdline ()
791 local word subcommand c=1
792 while [ $c -lt $cword ]; do
794 for subcommand in $1; do
795 if [ "$subcommand" = "$word" ]; then
804 __git_has_doubledash ()
807 while [ $c -lt $cword ]; do
808 if [ "--" = "${words[c]}" ]; then
816 # Try to count non option arguments passed on the command line for the
817 # specified git command.
818 # When options are used, it is necessary to use the special -- option to
819 # tell the implementation were non option arguments begin.
820 # XXX this can not be improved, since options can appear everywhere, as
824 # __git_count_arguments requires 1 argument: the git command executed.
825 __git_count_arguments ()
829 # Skip "git" (first argument)
830 for ((i=1; i < ${#words[@]}; i++)); do
835 # Good; we can assume that the following are only non
840 # Skip the specified git command and discard git
853 __git_whitespacelist="nowarn warn error error-all fix"
857 local dir="$(__gitdir)"
858 if [ -d "$dir"/rebase-apply ]; then
859 __gitcomp "--skip --continue --resolved --abort"
864 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
869 --3way --committer-date-is-author-date --ignore-date
870 --ignore-whitespace --ignore-space-change
871 --interactive --keep --no-utf8 --signoff --utf8
872 --whitespace= --scissors
882 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
887 --stat --numstat --summary --check --index
888 --cached --index-info --reverse --reject --unidiff-zero
889 --apply --no-add --exclude= --staged
890 --ignore-whitespace --ignore-space-change
891 --whitespace= --inaccurate-eof --verbose
902 --interactive --refresh --patch --update --dry-run
903 --ignore-errors --intent-to-add
908 # XXX should we check for --update and --all options ?
909 __git_complete_index_file "--others --modified --directory --no-empty-directory"
916 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
920 __gitcomp_nl "$(__git_remotes)" "" "${cur##--remote=}"
925 --format= --list --verbose
926 --prefix= --remote= --exec=
936 __git_has_doubledash && return
938 local subcommands="start bad good skip reset visualize replay log run"
939 local subcommand="$(__git_find_on_cmdline "$subcommands")"
940 if [ -z "$subcommand" ]; then
941 if [ -f "$(__gitdir)"/BISECT_START ]; then
942 __gitcomp "$subcommands"
944 __gitcomp "replay start"
949 case "$subcommand" in
950 bad|good|reset|skip|start)
951 __gitcomp_nl "$(__git_refs)"
960 local i c=1 only_local_ref="n" has_r="n"
962 while [ $c -lt $cword ]; do
965 -d|-m) only_local_ref="y" ;;
973 __gitcomp_nl "$(__git_refs)" "" "${cur##--set-upstream-to=}"
977 --color --no-color --verbose --abbrev= --no-abbrev
978 --track --no-track --contains --merged --no-merged
979 --set-upstream-to= --edit-description --list
984 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
985 __gitcomp_nl "$(__git_heads)"
987 __gitcomp_nl "$(__git_refs)"
995 local cmd="${words[2]}"
998 __gitcomp "create list-heads verify unbundle"
1001 # looking for a file
1006 __git_complete_revlist
1015 __git_has_doubledash && return
1019 __gitcomp "diff3 merge" "" "${cur##--conflict=}"
1023 --quiet --ours --theirs --track --no-track --merge
1024 --conflict= --orphan --patch
1028 # check if --track, --no-track, or --no-guess was specified
1029 # if so, disable DWIM mode
1030 local flags="--track --no-track --no-guess" track=1
1031 if [ -n "$(__git_find_on_cmdline "$flags")" ]; then
1034 __gitcomp_nl "$(__git_refs '' $track)"
1041 __gitcomp_nl "$(__git_refs)"
1046 local dir="$(__gitdir)"
1047 if [ -f "$dir"/CHERRY_PICK_HEAD ]; then
1048 __gitcomp "--continue --quit --abort"
1053 __gitcomp "--edit --no-commit --signoff --strategy= --mainline"
1056 __gitcomp_nl "$(__git_refs)"
1065 __gitcomp "--dry-run --quiet"
1070 # XXX should we check for -x option ?
1071 __git_complete_index_file "--others --directory"
1103 __gitcomp_nl "$(__git_refs)" "" "${cur}"
1110 __gitcomp "default scissors strip verbatim whitespace
1111 " "" "${cur##--cleanup=}"
1114 --reuse-message=*|--reedit-message=*|\
1115 --fixup=*|--squash=*)
1116 __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1119 --untracked-files=*)
1120 __gitcomp "all no normal" "" "${cur##--untracked-files=}"
1125 --all --author= --signoff --verify --no-verify
1127 --amend --include --only --interactive
1128 --dry-run --reuse-message= --reedit-message=
1129 --reset-author --file= --message= --template=
1130 --cleanup= --untracked-files --untracked-files=
1131 --verbose --quiet --fixup= --squash=
1136 if git rev-parse --verify --quiet HEAD >/dev/null; then
1137 __git_complete_index_file "--committable"
1139 # This is the first commit
1140 __git_complete_index_file "--cached"
1149 --all --tags --contains --abbrev= --candidates=
1150 --exact-match --debug --long --match --always
1154 __gitcomp_nl "$(__git_refs)"
1157 __git_diff_algorithms="myers minimal patience histogram"
1159 __git_diff_common_options="--stat --numstat --shortstat --summary
1160 --patch-with-stat --name-only --name-status --color
1161 --no-color --color-words --no-renames --check
1162 --full-index --binary --abbrev --diff-filter=
1163 --find-copies-harder
1164 --text --ignore-space-at-eol --ignore-space-change
1165 --ignore-all-space --ignore-blank-lines --exit-code
1166 --quiet --ext-diff --no-ext-diff
1167 --no-prefix --src-prefix= --dst-prefix=
1168 --inter-hunk-context=
1169 --patience --histogram --minimal
1171 --dirstat --dirstat= --dirstat-by-file
1172 --dirstat-by-file= --cumulative
1178 __git_has_doubledash && return
1182 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
1186 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1187 --base --ours --theirs --no-index
1188 $__git_diff_common_options
1193 __git_complete_revlist_file
1196 __git_mergetools_common="diffuse diffmerge ecmerge emerge kdiff3 meld opendiff
1197 tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc codecompare
1202 __git_has_doubledash && return
1206 __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
1210 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1211 --base --ours --theirs
1212 --no-renames --diff-filter= --find-copies-harder
1213 --relative --ignore-submodules
1218 __git_complete_revlist_file
1221 __git_fetch_recurse_submodules="yes on-demand no"
1223 __git_fetch_options="
1224 --quiet --verbose --append --upload-pack --force --keep --depth=
1225 --tags --no-tags --all --prune --dry-run --recurse-submodules=
1226 --no-recurse-submodules --unshallow --update-shallow --multiple
1227 --submodule-prefix= --update-head-ok --progress
1233 --recurse-submodules=*)
1234 __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
1238 __gitcomp "$__git_fetch_options"
1242 __git_complete_remote_or_refspec
1245 __git_format_patch_options="
1246 --stdout --attach --no-attach --thread --thread= --no-thread
1247 --numbered --start-number --numbered-files --keep-subject --signoff
1248 --signature --no-signature --in-reply-to= --cc= --full-index --binary
1249 --not --all --cover-letter --no-prefix --src-prefix= --dst-prefix=
1250 --inline --suffix= --ignore-if-in-upstream --subject-prefix=
1251 --output-directory --reroll-count --to= --quiet --notes
1254 _git_format_patch ()
1260 " "" "${cur##--thread=}"
1264 __gitcomp "$__git_format_patch_options"
1268 __git_complete_revlist
1276 --tags --root --unreachable --cache --no-reflogs --full
1277 --strict --verbose --lost-found
1288 __gitcomp "--prune --aggressive"
1299 __git_match_ctag() {
1300 awk "/^${1//\//\\/}/ { print \$1 }" "$2"
1305 __git_has_doubledash && return
1311 --text --ignore-case --word-regexp --invert-match
1312 --full-name --line-number
1313 --extended-regexp --basic-regexp --fixed-strings
1315 --files-with-matches --name-only
1316 --files-without-match
1319 --and --or --not --all-match
1325 case "$cword,$prev" in
1327 if test -r tags; then
1328 __gitcomp_nl "$(__git_match_ctag "$cur" tags)"
1334 __gitcomp_nl "$(__git_refs)"
1341 __gitcomp "--all --info --man --web"
1345 __git_compute_all_commands
1346 __gitcomp "$__git_all_commands $(__git_aliases)
1347 attributes cli core-tutorial cvs-migration
1348 diffcore gitk glossary hooks ignore modules
1349 namespaces repository-layout tutorial tutorial-2
1359 false true umask group all world everybody
1360 " "" "${cur##--shared=}"
1364 __gitcomp "--quiet --bare --template= --shared --shared="
1374 __gitcomp "--cached --deleted --modified --others --ignored
1375 --stage --directory --no-empty-directory --unmerged
1376 --killed --exclude= --exclude-from=
1377 --exclude-per-directory= --exclude-standard
1378 --error-unmatch --with-tree= --full-name
1379 --abbrev --ignored --exclude-per-directory
1385 # XXX ignore options like --modified and always suggest all cached
1387 __git_complete_index_file "--cached"
1392 __gitcomp_nl "$(__git_remotes)"
1400 # Options that go well for log, shortlog and gitk
1401 __git_log_common_options="
1403 --branches --tags --remotes
1404 --first-parent --merges --no-merges
1406 --max-age= --since= --after=
1407 --min-age= --until= --before=
1408 --min-parents= --max-parents=
1409 --no-min-parents --no-max-parents
1411 # Options that go well for log and gitk (not shortlog)
1412 __git_log_gitk_options="
1413 --dense --sparse --full-history
1414 --simplify-merges --simplify-by-decoration
1415 --left-right --notes --no-notes
1417 # Options that go well for log and shortlog (not gitk)
1418 __git_log_shortlog_options="
1419 --author= --committer= --grep=
1420 --all-match --invert-grep
1423 __git_log_pretty_formats="oneline short medium full fuller email raw format:"
1424 __git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1428 __git_has_doubledash && return
1430 local g="$(git rev-parse --git-dir 2>/dev/null)"
1432 if [ -f "$g/MERGE_HEAD" ]; then
1436 --pretty=*|--format=*)
1437 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
1442 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1446 __gitcomp "full short no" "" "${cur##--decorate=}"
1451 $__git_log_common_options
1452 $__git_log_shortlog_options
1453 $__git_log_gitk_options
1454 --root --topo-order --date-order --reverse
1455 --follow --full-diff
1456 --abbrev-commit --abbrev=
1457 --relative-date --date=
1458 --pretty= --format= --oneline
1462 --decorate --decorate=
1464 --parents --children
1466 $__git_diff_common_options
1467 --pickaxe-all --pickaxe-regex
1472 __git_complete_revlist
1475 # Common merge options shared by git-merge(1) and git-pull(1).
1476 __git_merge_options="
1477 --no-commit --no-stat --log --no-log --squash --strategy
1478 --commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit
1479 --verify-signatures --no-verify-signatures --gpg-sign
1480 --quiet --verbose --progress --no-progress
1485 __git_complete_strategy && return
1489 __gitcomp "$__git_merge_options
1490 --rerere-autoupdate --no-rerere-autoupdate --abort"
1493 __gitcomp_nl "$(__git_refs)"
1500 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1514 __gitcomp "--octopus --independent --is-ancestor --fork-point"
1518 __gitcomp_nl "$(__git_refs)"
1525 __gitcomp "--dry-run"
1530 if [ $(__git_count_arguments "mv") -gt 0 ]; then
1531 # We need to show both cached and untracked files (including
1532 # empty directories) since this may not be the last argument.
1533 __git_complete_index_file "--cached --others --directory"
1535 __git_complete_index_file "--cached"
1541 __gitcomp "--tags --all --stdin"
1546 local subcommands='add append copy edit list prune remove show'
1547 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1549 case "$subcommand,$cur" in
1556 __gitcomp_nl "$(__git_refs)"
1559 __gitcomp "$subcommands --ref"
1563 add,--reuse-message=*|append,--reuse-message=*|\
1564 add,--reedit-message=*|append,--reedit-message=*)
1565 __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1568 __gitcomp '--file= --message= --reedit-message=
1575 __gitcomp '--dry-run --verbose'
1584 __gitcomp_nl "$(__git_refs)"
1593 __git_complete_strategy && return
1596 --recurse-submodules=*)
1597 __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
1602 --rebase --no-rebase
1603 $__git_merge_options
1604 $__git_fetch_options
1609 __git_complete_remote_or_refspec
1612 __git_push_recurse_submodules="check on-demand"
1614 __git_complete_force_with_lease ()
1622 __gitcomp_nl "$(__git_refs)" "" "${cur_#*:}"
1625 __gitcomp_nl "$(__git_refs)" "" "$cur_"
1634 __gitcomp_nl "$(__git_remotes)"
1637 --recurse-submodules)
1638 __gitcomp "$__git_push_recurse_submodules"
1644 __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}"
1647 --recurse-submodules=*)
1648 __gitcomp "$__git_push_recurse_submodules" "" "${cur##--recurse-submodules=}"
1651 --force-with-lease=*)
1652 __git_complete_force_with_lease "${cur##--force-with-lease=}"
1657 --all --mirror --tags --dry-run --force --verbose
1658 --quiet --prune --delete --follow-tags
1659 --receive-pack= --repo= --set-upstream
1660 --force-with-lease --force-with-lease= --recurse-submodules=
1665 __git_complete_remote_or_refspec
1670 local dir="$(__gitdir)"
1671 if [ -f "$dir"/rebase-merge/interactive ]; then
1672 __gitcomp "--continue --skip --abort --edit-todo"
1674 elif [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1675 __gitcomp "--continue --skip --abort"
1678 __git_complete_strategy && return
1681 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1686 --onto --merge --strategy --interactive
1687 --preserve-merges --stat --no-stat
1688 --committer-date-is-author-date --ignore-date
1689 --ignore-whitespace --whitespace=
1690 --autosquash --fork-point --no-fork-point
1696 __gitcomp_nl "$(__git_refs)"
1701 local subcommands="show delete expire"
1702 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1704 if [ -z "$subcommand" ]; then
1705 __gitcomp "$subcommands"
1707 __gitcomp_nl "$(__git_refs)"
1711 __git_send_email_confirm_options="always never auto cc compose"
1712 __git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
1719 $__git_send_email_confirm_options
1720 " "" "${cur##--confirm=}"
1725 $__git_send_email_suppresscc_options
1726 " "" "${cur##--suppress-cc=}"
1730 --smtp-encryption=*)
1731 __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1737 " "" "${cur##--thread=}"
1741 __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1742 --compose --confirm= --dry-run --envelope-sender
1744 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1745 --no-suppress-from --no-thread --quiet
1746 --signed-off-by-cc --smtp-pass --smtp-server
1747 --smtp-server-port --smtp-encryption= --smtp-user
1748 --subject --suppress-cc= --suppress-from --thread --to
1749 --validate --no-validate
1750 $__git_format_patch_options"
1754 __git_complete_revlist
1759 __git_has_doubledash && return
1761 local subcommands="add reset diff rm apply edit"
1762 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1763 if [ -z "$subcommand" ]; then
1764 __gitcomp "$subcommands"
1768 case "$subcommand" in
1786 __git_config_get_set_variables ()
1788 local prevword word config_file= c=$cword
1789 while [ $c -gt 1 ]; do
1792 --system|--global|--local|--file=*)
1797 config_file="$word $prevword"
1805 git --git-dir="$(__gitdir)" config $config_file --name-only --list 2>/dev/null
1811 branch.*.remote|branch.*.pushremote)
1812 __gitcomp_nl "$(__git_remotes)"
1816 __gitcomp_nl "$(__git_refs)"
1820 __gitcomp "false true"
1824 __gitcomp_nl "$(__git_remotes)"
1828 local remote="${prev#remote.}"
1829 remote="${remote%.fetch}"
1830 if [ -z "$cur" ]; then
1831 __gitcomp_nl "refs/heads/" "" "" ""
1834 __gitcomp_nl "$(__git_refs_remotes "$remote")"
1838 local remote="${prev#remote.}"
1839 remote="${remote%.push}"
1840 __gitcomp_nl "$(git --git-dir="$(__gitdir)" \
1841 for-each-ref --format='%(refname):%(refname)' \
1845 pull.twohead|pull.octopus)
1846 __git_compute_merge_strategies
1847 __gitcomp "$__git_merge_strategies"
1850 color.branch|color.diff|color.interactive|\
1851 color.showbranch|color.status|color.ui)
1852 __gitcomp "always never auto"
1856 __gitcomp "false true"
1861 normal black red green yellow blue magenta cyan white
1862 bold dim ul blink reverse
1867 __gitcomp "log short"
1871 __gitcomp "man info web html"
1875 __gitcomp "$__git_log_date_formats"
1878 sendemail.aliasesfiletype)
1879 __gitcomp "mutt mailrc pine elm gnus"
1883 __gitcomp "$__git_send_email_confirm_options"
1886 sendemail.suppresscc)
1887 __gitcomp "$__git_send_email_suppresscc_options"
1890 sendemail.transferencoding)
1891 __gitcomp "7bit 8bit quoted-printable base64"
1894 --get|--get-all|--unset|--unset-all)
1895 __gitcomp_nl "$(__git_config_get_set_variables)"
1905 --system --global --local --file=
1906 --list --replace-all
1907 --get --get-all --get-regexp
1908 --add --unset --unset-all
1909 --remove-section --rename-section
1915 local pfx="${cur%.*}." cur_="${cur##*.}"
1916 __gitcomp "remote pushremote merge mergeoptions rebase" "$pfx" "$cur_"
1920 local pfx="${cur%.*}." cur_="${cur#*.}"
1921 __gitcomp_nl "$(__git_heads)" "$pfx" "$cur_" "."
1922 __gitcomp_nl_append $'autosetupmerge\nautosetuprebase\n' "$pfx" "$cur_"
1926 local pfx="${cur%.*}." cur_="${cur##*.}"
1928 argprompt cmd confirm needsfile noconsole norescan
1929 prompt revprompt revunmerged title
1934 local pfx="${cur%.*}." cur_="${cur##*.}"
1935 __gitcomp "cmd path" "$pfx" "$cur_"
1939 local pfx="${cur%.*}." cur_="${cur##*.}"
1940 __gitcomp "cmd path" "$pfx" "$cur_"
1944 local pfx="${cur%.*}." cur_="${cur##*.}"
1945 __gitcomp "cmd path trustExitCode" "$pfx" "$cur_"
1949 local pfx="${cur%.*}." cur_="${cur#*.}"
1950 __git_compute_all_commands
1951 __gitcomp_nl "$__git_all_commands" "$pfx" "$cur_"
1955 local pfx="${cur%.*}." cur_="${cur##*.}"
1957 url proxy fetch push mirror skipDefaultUpdate
1958 receivepack uploadpack tagopt pushurl
1963 local pfx="${cur%.*}." cur_="${cur#*.}"
1964 __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
1965 __gitcomp_nl_append "pushdefault" "$pfx" "$cur_"
1969 local pfx="${cur%.*}." cur_="${cur##*.}"
1970 __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_"
1976 advice.commitBeforeMerge
1978 advice.implicitIdentity
1979 advice.pushNonFastForward
1980 advice.resolveConflict
1984 apply.ignorewhitespace
1986 branch.autosetupmerge
1987 branch.autosetuprebase
1991 color.branch.current
1996 color.decorate.branch
1997 color.decorate.remoteBranch
1998 color.decorate.stash
2008 color.diff.whitespace
2013 color.grep.linenumber
2016 color.grep.separator
2018 color.interactive.error
2019 color.interactive.header
2020 color.interactive.help
2021 color.interactive.prompt
2026 color.status.changed
2028 color.status.nobranch
2029 color.status.unmerged
2030 color.status.untracked
2031 color.status.updated
2040 core.bigFileThreshold
2043 core.deltaBaseCacheLimit
2048 core.fsyncobjectfiles
2052 core.logAllRefUpdates
2053 core.loosecompression
2056 core.packedGitWindowSize
2058 core.preferSymlinkRefs
2061 core.repositoryFormatVersion
2063 core.sharedRepository
2067 core.warnAmbiguousRefs
2070 diff.autorefreshindex
2072 diff.ignoreSubmodules
2079 diff.suppressBlankEmpty
2085 fetch.recurseSubmodules
2095 format.subjectprefix
2106 gc.reflogexpireunreachable
2110 gitcvs.commitmsgannotation
2111 gitcvs.dbTableNamePrefix
2122 gui.copyblamethreshold
2126 gui.matchtrackingbranch
2127 gui.newbranchtemplate
2128 gui.pruneduringfetch
2129 gui.spellingdictionary
2146 http.sslCertPasswordProtected
2151 i18n.logOutputEncoding
2157 imap.preformattedHTML
2167 interactive.singlekey
2183 mergetool.keepBackup
2184 mergetool.keepTemporaries
2189 notes.rewrite.rebase
2193 pack.deltaCacheLimit
2210 receive.denyCurrentBranch
2211 receive.denyDeleteCurrent
2213 receive.denyNonFastForwards
2216 receive.updateserverinfo
2219 repack.usedeltabaseoffset
2223 sendemail.aliasesfile
2224 sendemail.aliasfiletype
2228 sendemail.chainreplyto
2230 sendemail.envelopesender
2234 sendemail.signedoffbycc
2235 sendemail.smtpdomain
2236 sendemail.smtpencryption
2238 sendemail.smtpserver
2239 sendemail.smtpserveroption
2240 sendemail.smtpserverport
2242 sendemail.suppresscc
2243 sendemail.suppressfrom
2248 status.relativePaths
2249 status.showUntrackedFiles
2250 status.submodulesummary
2253 transfer.unpackLimit
2265 local subcommands="add rename remove set-head set-branches set-url show prune update"
2266 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2267 if [ -z "$subcommand" ]; then
2268 __gitcomp "$subcommands"
2272 case "$subcommand" in
2273 rename|remove|set-url|show|prune)
2274 __gitcomp_nl "$(__git_remotes)"
2276 set-head|set-branches)
2277 __git_complete_remote_or_refspec
2280 __gitcomp "$(__git_get_config_variables "remotes")"
2289 __gitcomp_nl "$(__git_refs)"
2294 __git_has_doubledash && return
2298 __gitcomp "--merge --mixed --hard --soft --patch --keep --merge
2299 --stage --no-stage --work --no-work"
2303 __gitcomp_nl "$(__git_refs)"
2308 local dir="$(__gitdir)"
2309 if [ -f "$dir"/REVERT_HEAD ]; then
2310 __gitcomp "--continue --quit --abort"
2315 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
2319 __gitcomp_nl "$(__git_refs)"
2326 __gitcomp "--cached --staged --dry-run --ignore-unmatch --quiet"
2331 __git_complete_index_file "--cached"
2336 __git_has_doubledash && return
2341 $__git_log_common_options
2342 $__git_log_shortlog_options
2343 --numbered --summary
2348 __git_complete_revlist
2353 __git_has_doubledash && return
2356 --pretty=*|--format=*)
2357 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
2362 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
2366 __gitcomp "--pretty= --format= --abbrev-commit --oneline
2368 $__git_diff_common_options
2373 __git_complete_revlist_file
2381 --all --remotes --topo-order --current --more=
2382 --list --independent --merge-base --no-name
2384 --sha1-name --sparse --topics --reflog
2389 __git_complete_revlist
2394 local save_opts='--keep-index --no-keep-index --stage --no-stage --quiet --patch'
2395 local subcommands='save list show apply clear drop pop create branch'
2396 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2397 if [ -z "$subcommand" ]; then
2400 __gitcomp "$save_opts"
2403 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2404 __gitcomp "$subcommands"
2409 case "$subcommand,$cur" in
2411 __gitcomp "$save_opts"
2414 __gitcomp "--index --stage --quiet"
2416 show,--*|drop,--*|branch,--*)
2418 show,*|apply,*|drop,*|pop,*|branch,*)
2419 __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
2420 | sed -n -e 's/:.*//p')"
2430 __git_has_doubledash && return
2432 local subcommands="add status init deinit update summary foreach sync"
2433 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2436 __gitcomp "--quiet --cached"
2439 __gitcomp "$subcommands"
2449 init fetch clone rebase dcommit log find-rev
2450 set-tree commit-diff info create-ignore propget
2451 proplist show-ignore show-externals branch tag blame
2452 migrate mkdirs reset gc
2454 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2455 if [ -z "$subcommand" ]; then
2456 __gitcomp "$subcommands"
2458 local remote_opts="--username= --config-dir= --no-auth-cache"
2460 --follow-parent --authors-file= --repack=
2461 --no-metadata --use-svm-props --use-svnsync-props
2462 --log-window-size= --no-checkout --quiet
2463 --repack-flags --use-log-author --localtime
2464 --ignore-paths= --include-paths= $remote_opts
2467 --template= --shared= --trunk= --tags=
2468 --branches= --stdlayout --minimize-url
2469 --no-metadata --use-svm-props --use-svnsync-props
2470 --rewrite-root= --prefix= --use-log-author
2471 --add-author-from $remote_opts
2474 --edit --rmdir --find-copies-harder --copy-similarity=
2477 case "$subcommand,$cur" in
2479 __gitcomp "--revision= --fetch-all $fc_opts"
2482 __gitcomp "--revision= $fc_opts $init_opts"
2485 __gitcomp "$init_opts"
2489 --merge --strategy= --verbose --dry-run
2490 --fetch-all --no-rebase --commit-url
2491 --revision --interactive $cmt_opts $fc_opts
2495 __gitcomp "--stdin $cmt_opts $fc_opts"
2497 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
2498 show-externals,--*|mkdirs,--*)
2499 __gitcomp "--revision="
2503 --limit= --revision= --verbose --incremental
2504 --oneline --show-commit --non-recursive
2505 --authors-file= --color
2510 --merge --verbose --strategy= --local
2511 --fetch-all --dry-run $fc_opts
2515 __gitcomp "--message= --file= --revision= $cmt_opts"
2521 __gitcomp "--dry-run --message --tag"
2524 __gitcomp "--dry-run --message"
2527 __gitcomp "--git-format"
2531 --config-dir= --ignore-paths= --minimize
2532 --no-auth-cache --username=
2536 __gitcomp "--revision= --parent"
2547 while [ $c -lt $cword ]; do
2551 __gitcomp_nl "$(__git_tags)"
2566 __gitcomp_nl "$(__git_tags)"
2570 __gitcomp_nl "$(__git_refs)"
2577 --list --delete --verify --annotate --message --file
2578 --sign --cleanup --local-user --force --column --sort
2579 --contains --points-at
2592 local i c=1 command __git_dir
2594 while [ $c -lt $cword ]; do
2597 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2598 --git-dir) ((c++)) ; __git_dir="${words[c]}" ;;
2599 --bare) __git_dir="." ;;
2600 --help) command="help"; break ;;
2601 -c|--work-tree|--namespace) ((c++)) ;;
2603 *) command="$i"; break ;;
2608 if [ -z "$command" ]; then
2623 --no-replace-objects
2627 *) __git_compute_porcelain_commands
2628 __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
2633 local completion_func="_git_${command//-/_}"
2634 declare -f $completion_func >/dev/null && $completion_func && return
2636 local expansion=$(__git_aliased_command "$command")
2637 if [ -n "$expansion" ]; then
2639 completion_func="_git_${expansion//-/_}"
2640 declare -f $completion_func >/dev/null && $completion_func
2646 __git_has_doubledash && return
2648 local g="$(__gitdir)"
2650 if [ -f "$g/MERGE_HEAD" ]; then
2656 $__git_log_common_options
2657 $__git_log_gitk_options
2663 __git_complete_revlist
2668 local cur words cword prev
2669 _get_comp_words_by_ref -n =: cur words cword prev
2673 # Setup completion for certain functions defined above by setting common
2674 # variables and workarounds.
2675 # This is NOT a public function; use at your own risk.
2678 test -n "$ZSH_VERSION" && return
2679 local wrapper="__git_wrap${2}"
2680 eval "$wrapper () { __git_func_wrap $2 ; }"
2681 complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \
2682 || complete -o default -o nospace -F $wrapper $1
2685 __git_complete git __git_main
2686 __git_complete gitk __gitk_main
2688 # The following are necessary only for Cygwin, and only are needed
2689 # when the user has tab-completed the executable name and consequently
2690 # included the '.exe' suffix.
2692 test "$(uname -o 2>/dev/null)" = "Cygwin" &&
2693 __git_complete git.exe __git_main