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 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)" -- "refs/remotes/$dir/" | sed -e "s#^$dir/##"
392 # __git_refs2 requires 1 argument (to pass to __git_refs)
396 for i in $(__git_refs "$1"); do
401 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
402 __git_refs_remotes ()
405 git ls-remote "$1" 'refs/heads/*' 2>/dev/null | \
406 while read -r hash i; do
407 echo "$i:refs/remotes/$1/${i#refs/heads/}"
413 local i IFS=$'\n' d="$(__gitdir)"
414 test -d "$d/remotes" && ls -1 "$d/remotes"
415 for i in $(git --git-dir="$d" config --get-regexp 'remote\..*\.url' 2>/dev/null); do
421 __git_list_merge_strategies ()
423 git merge -s help 2>&1 |
424 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
433 __git_merge_strategies=
434 # 'git merge -s help' (and thus detection of the merge strategy
435 # list) fails, unfortunately, if run outside of any git working
436 # tree. __git_merge_strategies is set to the empty string in
437 # that case, and the detection will be repeated the next time it
439 __git_compute_merge_strategies ()
441 test -n "$__git_merge_strategies" ||
442 __git_merge_strategies=$(__git_list_merge_strategies)
445 __git_complete_revlist_file ()
447 local pfx ls ref cur_="$cur"
467 case "$COMP_WORDBREAKS" in
469 *) pfx="$ref:$pfx" ;;
472 __gitcomp_nl "$(git --git-dir="$(__gitdir)" ls-tree "$ls" 2>/dev/null \
473 | sed '/^100... blob /{
489 pfx="${cur_%...*}..."
491 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
496 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
499 __gitcomp_nl "$(__git_refs)"
505 # __git_complete_index_file requires 1 argument:
506 # 1: the options to pass to ls-file
508 # The exception is --committable, which finds the files appropriate commit.
509 __git_complete_index_file ()
511 local pfx="" cur_="$cur"
521 __gitcomp_file "$(__git_index_files "$1" ${pfx:+"$pfx"})" "$pfx" "$cur_"
524 __git_complete_file ()
526 __git_complete_revlist_file
529 __git_complete_revlist ()
531 __git_complete_revlist_file
534 __git_complete_remote_or_refspec ()
536 local cur_="$cur" cmd="${words[1]}"
537 local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0
538 if [ "$cmd" = "remote" ]; then
541 while [ $c -lt $cword ]; do
544 --mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
547 push) no_complete_refspec=1 ;;
555 *) remote="$i"; break ;;
559 if [ -z "$remote" ]; then
560 __gitcomp_nl "$(__git_remotes)"
563 if [ $no_complete_refspec = 1 ]; then
566 [ "$remote" = "." ] && remote=
569 case "$COMP_WORDBREAKS" in
571 *) pfx="${cur_%%:*}:" ;;
583 if [ $lhs = 1 ]; then
584 __gitcomp_nl "$(__git_refs2 "$remote")" "$pfx" "$cur_"
586 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
590 if [ $lhs = 1 ]; then
591 __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
593 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
597 if [ $lhs = 1 ]; then
598 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
600 __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
606 __git_complete_strategy ()
608 __git_compute_merge_strategies
611 __gitcomp "$__git_merge_strategies"
616 __gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}"
624 if test -n "${GIT_TESTING_COMMAND_COMPLETION:-}"
626 printf "%s" "${GIT_TESTING_COMMAND_COMPLETION}"
628 git help -a|egrep '^ [a-zA-Z0-9]'
632 __git_list_all_commands ()
635 for i in $(__git_commands)
638 *--*) : helper pattern;;
645 __git_compute_all_commands ()
647 test -n "$__git_all_commands" ||
648 __git_all_commands=$(__git_list_all_commands)
651 __git_list_porcelain_commands ()
654 __git_compute_all_commands
655 for i in $__git_all_commands
658 *--*) : helper pattern;;
659 applymbox) : ask gittus;;
660 applypatch) : ask gittus;;
661 archimport) : import;;
662 cat-file) : plumbing;;
663 check-attr) : plumbing;;
664 check-ignore) : plumbing;;
665 check-mailmap) : plumbing;;
666 check-ref-format) : plumbing;;
667 checkout-index) : plumbing;;
668 commit-tree) : plumbing;;
669 count-objects) : infrequent;;
670 credential-cache) : credentials helper;;
671 credential-store) : credentials helper;;
672 cvsexportcommit) : export;;
673 cvsimport) : import;;
674 cvsserver) : daemon;;
676 diff-files) : plumbing;;
677 diff-index) : plumbing;;
678 diff-tree) : plumbing;;
679 fast-import) : import;;
680 fast-export) : export;;
681 fsck-objects) : plumbing;;
682 fetch-pack) : plumbing;;
683 fmt-merge-msg) : plumbing;;
684 for-each-ref) : plumbing;;
685 hash-object) : plumbing;;
686 http-*) : transport;;
687 index-pack) : plumbing;;
688 init-db) : deprecated;;
689 local-fetch) : plumbing;;
690 ls-files) : plumbing;;
691 ls-remote) : plumbing;;
692 ls-tree) : plumbing;;
693 mailinfo) : plumbing;;
694 mailsplit) : plumbing;;
695 merge-*) : plumbing;;
698 pack-objects) : plumbing;;
699 pack-redundant) : plumbing;;
700 pack-refs) : plumbing;;
701 parse-remote) : plumbing;;
702 patch-id) : plumbing;;
704 prune-packed) : plumbing;;
705 quiltimport) : import;;
706 read-tree) : plumbing;;
707 receive-pack) : plumbing;;
708 remote-*) : transport;;
710 rev-list) : plumbing;;
711 rev-parse) : plumbing;;
712 runstatus) : plumbing;;
713 sh-setup) : internal;;
715 show-ref) : plumbing;;
716 send-pack) : plumbing;;
717 show-index) : plumbing;;
719 stripspace) : plumbing;;
720 symbolic-ref) : plumbing;;
721 unpack-file) : plumbing;;
722 unpack-objects) : plumbing;;
723 update-index) : plumbing;;
724 update-ref) : plumbing;;
725 update-server-info) : daemon;;
726 upload-archive) : plumbing;;
727 upload-pack) : plumbing;;
728 write-tree) : plumbing;;
730 verify-pack) : infrequent;;
731 verify-tag) : plumbing;;
737 __git_porcelain_commands=
738 __git_compute_porcelain_commands ()
740 __git_compute_all_commands
741 test -n "$__git_porcelain_commands" ||
742 __git_porcelain_commands=$(__git_list_porcelain_commands)
745 __git_pretty_aliases ()
748 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "pretty\..*" 2>/dev/null); do
761 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "alias\..*" 2>/dev/null); do
771 # __git_aliased_command requires 1 argument
772 __git_aliased_command ()
774 local word cmdline=$(git --git-dir="$(__gitdir)" \
775 config --get "alias.$1")
776 for word in $cmdline; do
782 \!*) : shell command alias ;;
784 *=*) : setting env ;;
786 \(\)) : skip parens of shell function definition ;;
787 {) : skip start of shell helper function ;;
788 :) : skip null command ;;
789 \'*) : skip opening quote after sh -c ;;
797 # __git_find_on_cmdline requires 1 argument
798 __git_find_on_cmdline ()
800 local word subcommand c=1
801 while [ $c -lt $cword ]; do
803 for subcommand in $1; do
804 if [ "$subcommand" = "$word" ]; then
813 __git_has_doubledash ()
816 while [ $c -lt $cword ]; do
817 if [ "--" = "${words[c]}" ]; then
825 # Try to count non option arguments passed on the command line for the
826 # specified git command.
827 # When options are used, it is necessary to use the special -- option to
828 # tell the implementation were non option arguments begin.
829 # XXX this can not be improved, since options can appear everywhere, as
833 # __git_count_arguments requires 1 argument: the git command executed.
834 __git_count_arguments ()
838 # Skip "git" (first argument)
839 for ((i=1; i < ${#words[@]}; i++)); do
844 # Good; we can assume that the following are only non
849 # Skip the specified git command and discard git
862 __git_whitespacelist="nowarn warn error error-all fix"
866 local dir="$(__gitdir)"
867 if [ -d "$dir"/rebase-apply ]; then
868 __gitcomp "--skip --continue --resolved --abort"
873 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
878 --3way --committer-date-is-author-date --ignore-date
879 --ignore-whitespace --ignore-space-change
880 --interactive --keep --no-utf8 --signoff --utf8
881 --whitespace= --scissors
891 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
896 --stat --numstat --summary --check --index
897 --cached --index-info --reverse --reject --unidiff-zero
898 --apply --no-add --exclude=
899 --ignore-whitespace --ignore-space-change
900 --whitespace= --inaccurate-eof --verbose
911 --interactive --refresh --patch --update --dry-run
912 --ignore-errors --intent-to-add
917 # XXX should we check for --update and --all options ?
918 __git_complete_index_file "--others --modified --directory --no-empty-directory"
925 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
929 __gitcomp_nl "$(__git_remotes)" "" "${cur##--remote=}"
934 --format= --list --verbose
935 --prefix= --remote= --exec=
945 __git_has_doubledash && return
947 local subcommands="start bad good skip reset visualize replay log run"
948 local subcommand="$(__git_find_on_cmdline "$subcommands")"
949 if [ -z "$subcommand" ]; then
950 if [ -f "$(__gitdir)"/BISECT_START ]; then
951 __gitcomp "$subcommands"
953 __gitcomp "replay start"
958 case "$subcommand" in
959 bad|good|reset|skip|start)
960 __gitcomp_nl "$(__git_refs)"
969 local i c=1 only_local_ref="n" has_r="n"
971 while [ $c -lt $cword ]; do
974 -d|-m) only_local_ref="y" ;;
982 __gitcomp "$(__git_refs)" "" "${cur##--set-upstream-to=}"
986 --color --no-color --verbose --abbrev= --no-abbrev
987 --track --no-track --contains --merged --no-merged
988 --set-upstream-to= --edit-description --list
993 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
994 __gitcomp_nl "$(__git_heads)"
996 __gitcomp_nl "$(__git_refs)"
1004 local cmd="${words[2]}"
1007 __gitcomp "create list-heads verify unbundle"
1010 # looking for a file
1015 __git_complete_revlist
1024 __git_has_doubledash && return
1028 __gitcomp "diff3 merge" "" "${cur##--conflict=}"
1032 --quiet --ours --theirs --track --no-track --merge
1033 --conflict= --orphan --patch
1037 # check if --track, --no-track, or --no-guess was specified
1038 # if so, disable DWIM mode
1039 local flags="--track --no-track --no-guess" track=1
1040 if [ -n "$(__git_find_on_cmdline "$flags")" ]; then
1043 __gitcomp_nl "$(__git_refs '' $track)"
1050 __gitcomp "$(__git_refs)"
1055 local dir="$(__gitdir)"
1056 if [ -f "$dir"/CHERRY_PICK_HEAD ]; then
1057 __gitcomp "--continue --quit --abort"
1062 __gitcomp "--edit --no-commit --signoff --strategy= --mainline"
1065 __gitcomp_nl "$(__git_refs)"
1074 __gitcomp "--dry-run --quiet"
1079 # XXX should we check for -x option ?
1080 __git_complete_index_file "--others --directory"
1112 __gitcomp_nl "$(__git_refs)" "" "${cur}"
1119 __gitcomp "default strip verbatim whitespace
1120 " "" "${cur##--cleanup=}"
1123 --reuse-message=*|--reedit-message=*|\
1124 --fixup=*|--squash=*)
1125 __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1128 --untracked-files=*)
1129 __gitcomp "all no normal" "" "${cur##--untracked-files=}"
1134 --all --author= --signoff --verify --no-verify
1136 --amend --include --only --interactive
1137 --dry-run --reuse-message= --reedit-message=
1138 --reset-author --file= --message= --template=
1139 --cleanup= --untracked-files --untracked-files=
1140 --verbose --quiet --fixup= --squash=
1145 if git rev-parse --verify --quiet HEAD >/dev/null; then
1146 __git_complete_index_file "--committable"
1148 # This is the first commit
1149 __git_complete_index_file "--cached"
1158 --all --tags --contains --abbrev= --candidates=
1159 --exact-match --debug --long --match --always
1163 __gitcomp_nl "$(__git_refs)"
1166 __git_diff_algorithms="myers minimal patience histogram"
1168 __git_diff_common_options="--stat --numstat --shortstat --summary
1169 --patch-with-stat --name-only --name-status --color
1170 --no-color --color-words --no-renames --check
1171 --full-index --binary --abbrev --diff-filter=
1172 --find-copies-harder
1173 --text --ignore-space-at-eol --ignore-space-change
1174 --ignore-all-space --ignore-blank-lines --exit-code
1175 --quiet --ext-diff --no-ext-diff
1176 --no-prefix --src-prefix= --dst-prefix=
1177 --inter-hunk-context=
1178 --patience --histogram --minimal
1180 --dirstat --dirstat= --dirstat-by-file
1181 --dirstat-by-file= --cumulative
1187 __git_has_doubledash && return
1191 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
1195 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1196 --base --ours --theirs --no-index
1197 $__git_diff_common_options
1202 __git_complete_revlist_file
1205 __git_mergetools_common="diffuse diffmerge ecmerge emerge kdiff3 meld opendiff
1206 tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc3 codecompare
1211 __git_has_doubledash && return
1215 __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
1219 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1220 --base --ours --theirs
1221 --no-renames --diff-filter= --find-copies-harder
1222 --relative --ignore-submodules
1227 __git_complete_revlist_file
1230 __git_fetch_recurse_submodules="yes on-demand no"
1232 __git_fetch_options="
1233 --quiet --verbose --append --upload-pack --force --keep --depth=
1234 --tags --no-tags --all --prune --dry-run --recurse-submodules=
1240 --recurse-submodules=*)
1241 __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
1245 __gitcomp "$__git_fetch_options"
1249 __git_complete_remote_or_refspec
1252 __git_format_patch_options="
1253 --stdout --attach --no-attach --thread --thread= --no-thread
1254 --numbered --start-number --numbered-files --keep-subject --signoff
1255 --signature --no-signature --in-reply-to= --cc= --full-index --binary
1256 --not --all --cover-letter --no-prefix --src-prefix= --dst-prefix=
1257 --inline --suffix= --ignore-if-in-upstream --subject-prefix=
1258 --output-directory --reroll-count --to= --quiet --notes
1261 _git_format_patch ()
1267 " "" "${cur##--thread=}"
1271 __gitcomp "$__git_format_patch_options"
1275 __git_complete_revlist
1283 --tags --root --unreachable --cache --no-reflogs --full
1284 --strict --verbose --lost-found
1295 __gitcomp "--prune --aggressive"
1306 __git_match_ctag() {
1307 awk "/^${1////\\/}/ { print \$1 }" "$2"
1312 __git_has_doubledash && return
1318 --text --ignore-case --word-regexp --invert-match
1319 --full-name --line-number
1320 --extended-regexp --basic-regexp --fixed-strings
1322 --files-with-matches --name-only
1323 --files-without-match
1326 --and --or --not --all-match
1332 case "$cword,$prev" in
1334 if test -r tags; then
1335 __gitcomp_nl "$(__git_match_ctag "$cur" tags)"
1341 __gitcomp_nl "$(__git_refs)"
1348 __gitcomp "--all --info --man --web"
1352 __git_compute_all_commands
1353 __gitcomp "$__git_all_commands $(__git_aliases)
1354 attributes cli core-tutorial cvs-migration
1355 diffcore gitk glossary hooks ignore modules
1356 namespaces repository-layout tutorial tutorial-2
1366 false true umask group all world everybody
1367 " "" "${cur##--shared=}"
1371 __gitcomp "--quiet --bare --template= --shared --shared="
1381 __gitcomp "--cached --deleted --modified --others --ignored
1382 --stage --directory --no-empty-directory --unmerged
1383 --killed --exclude= --exclude-from=
1384 --exclude-per-directory= --exclude-standard
1385 --error-unmatch --with-tree= --full-name
1386 --abbrev --ignored --exclude-per-directory
1392 # XXX ignore options like --modified and always suggest all cached
1394 __git_complete_index_file "--cached"
1399 __gitcomp_nl "$(__git_remotes)"
1407 # Options that go well for log, shortlog and gitk
1408 __git_log_common_options="
1410 --branches --tags --remotes
1411 --first-parent --merges --no-merges
1413 --max-age= --since= --after=
1414 --min-age= --until= --before=
1415 --min-parents= --max-parents=
1416 --no-min-parents --no-max-parents
1418 # Options that go well for log and gitk (not shortlog)
1419 __git_log_gitk_options="
1420 --dense --sparse --full-history
1421 --simplify-merges --simplify-by-decoration
1422 --left-right --notes --no-notes
1424 # Options that go well for log and shortlog (not gitk)
1425 __git_log_shortlog_options="
1426 --author= --committer= --grep=
1430 __git_log_pretty_formats="oneline short medium full fuller email raw format:"
1431 __git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1435 __git_has_doubledash && return
1437 local g="$(git rev-parse --git-dir 2>/dev/null)"
1439 if [ -f "$g/MERGE_HEAD" ]; then
1443 --pretty=*|--format=*)
1444 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
1449 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1453 __gitcomp "long short" "" "${cur##--decorate=}"
1458 $__git_log_common_options
1459 $__git_log_shortlog_options
1460 $__git_log_gitk_options
1461 --root --topo-order --date-order --reverse
1462 --follow --full-diff
1463 --abbrev-commit --abbrev=
1464 --relative-date --date=
1465 --pretty= --format= --oneline
1469 --decorate --decorate=
1471 --parents --children
1473 $__git_diff_common_options
1474 --pickaxe-all --pickaxe-regex
1479 __git_complete_revlist
1482 # Common merge options shared by git-merge(1) and git-pull(1).
1483 __git_merge_options="
1484 --no-commit --no-stat --log --no-log --squash --strategy
1485 --commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit
1486 --verify-signatures --no-verify-signatures --gpg-sign
1487 --quiet --verbose --progress --no-progress
1492 __git_complete_strategy && return
1496 __gitcomp "$__git_merge_options
1497 --rerere-autoupdate --no-rerere-autoupdate --abort"
1500 __gitcomp_nl "$(__git_refs)"
1507 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1521 __gitcomp "--octopus --independent --is-ancestor --fork-point"
1525 __gitcomp_nl "$(__git_refs)"
1532 __gitcomp "--dry-run"
1537 if [ $(__git_count_arguments "mv") -gt 0 ]; then
1538 # We need to show both cached and untracked files (including
1539 # empty directories) since this may not be the last argument.
1540 __git_complete_index_file "--cached --others --directory"
1542 __git_complete_index_file "--cached"
1548 __gitcomp "--tags --all --stdin"
1553 local subcommands='add append copy edit list prune remove show'
1554 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1556 case "$subcommand,$cur" in
1563 __gitcomp_nl "$(__git_refs)"
1566 __gitcomp "$subcommands --ref"
1570 add,--reuse-message=*|append,--reuse-message=*|\
1571 add,--reedit-message=*|append,--reedit-message=*)
1572 __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1575 __gitcomp '--file= --message= --reedit-message=
1582 __gitcomp '--dry-run --verbose'
1591 __gitcomp_nl "$(__git_refs)"
1600 __git_complete_strategy && return
1603 --recurse-submodules=*)
1604 __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
1609 --rebase --no-rebase
1610 $__git_merge_options
1611 $__git_fetch_options
1616 __git_complete_remote_or_refspec
1619 __git_push_recurse_submodules="check on-demand"
1621 __git_complete_force_with_lease ()
1629 __gitcomp_nl "$(__git_refs)" "" "${cur_#*:}"
1632 __gitcomp_nl "$(__git_refs)" "" "$cur_"
1641 __gitcomp_nl "$(__git_remotes)"
1644 --recurse-submodules)
1645 __gitcomp "$__git_push_recurse_submodules"
1651 __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}"
1654 --recurse-submodules=*)
1655 __gitcomp "$__git_push_recurse_submodules" "" "${cur##--recurse-submodules=}"
1658 --force-with-lease=*)
1659 __git_complete_force_with_lease "${cur##--force-with-lease=}"
1664 --all --mirror --tags --dry-run --force --verbose
1665 --quiet --prune --delete --follow-tags
1666 --receive-pack= --repo= --set-upstream
1667 --force-with-lease --force-with-lease= --recurse-submodules=
1672 __git_complete_remote_or_refspec
1677 local dir="$(__gitdir)"
1678 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1679 __gitcomp "--continue --skip --abort"
1682 __git_complete_strategy && return
1685 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1690 --onto --merge --strategy --interactive
1691 --preserve-merges --stat --no-stat
1692 --committer-date-is-author-date --ignore-date
1693 --ignore-whitespace --whitespace=
1694 --autosquash --fork-point --no-fork-point
1699 __gitcomp_nl "$(__git_refs)"
1704 local subcommands="show delete expire"
1705 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1707 if [ -z "$subcommand" ]; then
1708 __gitcomp "$subcommands"
1710 __gitcomp_nl "$(__git_refs)"
1714 __git_send_email_confirm_options="always never auto cc compose"
1715 __git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
1722 $__git_send_email_confirm_options
1723 " "" "${cur##--confirm=}"
1728 $__git_send_email_suppresscc_options
1729 " "" "${cur##--suppress-cc=}"
1733 --smtp-encryption=*)
1734 __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1740 " "" "${cur##--thread=}"
1744 __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1745 --compose --confirm= --dry-run --envelope-sender
1747 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1748 --no-suppress-from --no-thread --quiet
1749 --signed-off-by-cc --smtp-pass --smtp-server
1750 --smtp-server-port --smtp-encryption= --smtp-user
1751 --subject --suppress-cc= --suppress-from --thread --to
1752 --validate --no-validate
1753 $__git_format_patch_options"
1757 __git_complete_revlist
1765 __git_config_get_set_variables ()
1767 local prevword word config_file= c=$cword
1768 while [ $c -gt 1 ]; do
1771 --system|--global|--local|--file=*)
1776 config_file="$word $prevword"
1784 git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null |
1798 branch.*.remote|branch.*.pushremote)
1799 __gitcomp_nl "$(__git_remotes)"
1803 __gitcomp_nl "$(__git_refs)"
1807 __gitcomp "false true"
1811 __gitcomp_nl "$(__git_remotes)"
1815 local remote="${prev#remote.}"
1816 remote="${remote%.fetch}"
1817 if [ -z "$cur" ]; then
1818 __gitcomp_nl "refs/heads/" "" "" ""
1821 __gitcomp_nl "$(__git_refs_remotes "$remote")"
1825 local remote="${prev#remote.}"
1826 remote="${remote%.push}"
1827 __gitcomp_nl "$(git --git-dir="$(__gitdir)" \
1828 for-each-ref --format='%(refname):%(refname)' \
1832 pull.twohead|pull.octopus)
1833 __git_compute_merge_strategies
1834 __gitcomp "$__git_merge_strategies"
1837 color.branch|color.diff|color.interactive|\
1838 color.showbranch|color.status|color.ui)
1839 __gitcomp "always never auto"
1843 __gitcomp "false true"
1848 normal black red green yellow blue magenta cyan white
1849 bold dim ul blink reverse
1854 __gitcomp "log short"
1858 __gitcomp "man info web html"
1862 __gitcomp "$__git_log_date_formats"
1865 sendemail.aliasesfiletype)
1866 __gitcomp "mutt mailrc pine elm gnus"
1870 __gitcomp "$__git_send_email_confirm_options"
1873 sendemail.suppresscc)
1874 __gitcomp "$__git_send_email_suppresscc_options"
1877 --get|--get-all|--unset|--unset-all)
1878 __gitcomp_nl "$(__git_config_get_set_variables)"
1888 --system --global --local --file=
1889 --list --replace-all
1890 --get --get-all --get-regexp
1891 --add --unset --unset-all
1892 --remove-section --rename-section
1897 local pfx="${cur%.*}." cur_="${cur##*.}"
1898 __gitcomp "remote pushremote merge mergeoptions rebase" "$pfx" "$cur_"
1902 local pfx="${cur%.*}." cur_="${cur#*.}"
1903 __gitcomp_nl "$(__git_heads)" "$pfx" "$cur_" "."
1904 __gitcomp_nl_append $'autosetupmerge\nautosetuprebase\n' "$pfx" "$cur_"
1908 local pfx="${cur%.*}." cur_="${cur##*.}"
1910 argprompt cmd confirm needsfile noconsole norescan
1911 prompt revprompt revunmerged title
1916 local pfx="${cur%.*}." cur_="${cur##*.}"
1917 __gitcomp "cmd path" "$pfx" "$cur_"
1921 local pfx="${cur%.*}." cur_="${cur##*.}"
1922 __gitcomp "cmd path" "$pfx" "$cur_"
1926 local pfx="${cur%.*}." cur_="${cur##*.}"
1927 __gitcomp "cmd path trustExitCode" "$pfx" "$cur_"
1931 local pfx="${cur%.*}." cur_="${cur#*.}"
1932 __git_compute_all_commands
1933 __gitcomp_nl "$__git_all_commands" "$pfx" "$cur_"
1937 local pfx="${cur%.*}." cur_="${cur##*.}"
1939 url proxy fetch push mirror skipDefaultUpdate
1940 receivepack uploadpack tagopt pushurl
1945 local pfx="${cur%.*}." cur_="${cur#*.}"
1946 __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
1947 __gitcomp_nl_append "pushdefault" "$pfx" "$cur_"
1951 local pfx="${cur%.*}." cur_="${cur##*.}"
1952 __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_"
1958 advice.commitBeforeMerge
1960 advice.implicitIdentity
1961 advice.pushNonFastForward
1962 advice.resolveConflict
1966 apply.ignorewhitespace
1968 branch.autosetupmerge
1969 branch.autosetuprebase
1973 color.branch.current
1978 color.decorate.branch
1979 color.decorate.remoteBranch
1980 color.decorate.stash
1990 color.diff.whitespace
1995 color.grep.linenumber
1998 color.grep.separator
2000 color.interactive.error
2001 color.interactive.header
2002 color.interactive.help
2003 color.interactive.prompt
2008 color.status.changed
2010 color.status.nobranch
2011 color.status.untracked
2012 color.status.updated
2021 core.bigFileThreshold
2024 core.deltaBaseCacheLimit
2029 core.fsyncobjectfiles
2033 core.logAllRefUpdates
2034 core.loosecompression
2037 core.packedGitWindowSize
2039 core.preferSymlinkRefs
2042 core.repositoryFormatVersion
2044 core.sharedRepository
2048 core.warnAmbiguousRefs
2051 diff.autorefreshindex
2053 diff.ignoreSubmodules
2060 diff.suppressBlankEmpty
2066 fetch.recurseSubmodules
2076 format.subjectprefix
2087 gc.reflogexpireunreachable
2091 gitcvs.commitmsgannotation
2092 gitcvs.dbTableNamePrefix
2103 gui.copyblamethreshold
2107 gui.matchtrackingbranch
2108 gui.newbranchtemplate
2109 gui.pruneduringfetch
2110 gui.spellingdictionary
2125 http.sslCertPasswordProtected
2130 i18n.logOutputEncoding
2136 imap.preformattedHTML
2146 interactive.singlekey
2162 mergetool.keepBackup
2163 mergetool.keepTemporaries
2168 notes.rewrite.rebase
2172 pack.deltaCacheLimit
2188 receive.denyCurrentBranch
2189 receive.denyDeleteCurrent
2191 receive.denyNonFastForwards
2194 receive.updateserverinfo
2197 repack.usedeltabaseoffset
2201 sendemail.aliasesfile
2202 sendemail.aliasfiletype
2206 sendemail.chainreplyto
2208 sendemail.envelopesender
2212 sendemail.signedoffbycc
2213 sendemail.smtpdomain
2214 sendemail.smtpencryption
2216 sendemail.smtpserver
2217 sendemail.smtpserveroption
2218 sendemail.smtpserverport
2220 sendemail.suppresscc
2221 sendemail.suppressfrom
2226 status.relativePaths
2227 status.showUntrackedFiles
2228 status.submodulesummary
2231 transfer.unpackLimit
2243 local subcommands="add rename remove set-head set-branches set-url show prune update"
2244 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2245 if [ -z "$subcommand" ]; then
2246 __gitcomp "$subcommands"
2250 case "$subcommand" in
2251 rename|remove|set-url|show|prune)
2252 __gitcomp_nl "$(__git_remotes)"
2254 set-head|set-branches)
2255 __git_complete_remote_or_refspec
2258 local i c='' IFS=$'\n'
2259 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "remotes\..*" 2>/dev/null); do
2272 __gitcomp_nl "$(__git_refs)"
2277 __git_has_doubledash && return
2281 __gitcomp "--merge --mixed --hard --soft --patch"
2285 __gitcomp_nl "$(__git_refs)"
2292 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
2296 __gitcomp_nl "$(__git_refs)"
2303 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
2308 __git_complete_index_file "--cached"
2313 __git_has_doubledash && return
2318 $__git_log_common_options
2319 $__git_log_shortlog_options
2320 --numbered --summary
2325 __git_complete_revlist
2330 __git_has_doubledash && return
2333 --pretty=*|--format=*)
2334 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
2339 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
2343 __gitcomp "--pretty= --format= --abbrev-commit --oneline
2345 $__git_diff_common_options
2350 __git_complete_revlist_file
2358 --all --remotes --topo-order --current --more=
2359 --list --independent --merge-base --no-name
2361 --sha1-name --sparse --topics --reflog
2366 __git_complete_revlist
2371 local save_opts='--keep-index --no-keep-index --quiet --patch'
2372 local subcommands='save list show apply clear drop pop create branch'
2373 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2374 if [ -z "$subcommand" ]; then
2377 __gitcomp "$save_opts"
2380 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2381 __gitcomp "$subcommands"
2386 case "$subcommand,$cur" in
2388 __gitcomp "$save_opts"
2391 __gitcomp "--index --quiet"
2393 show,--*|drop,--*|branch,--*)
2395 show,*|apply,*|drop,*|pop,*|branch,*)
2396 __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
2397 | sed -n -e 's/:.*//p')"
2407 __git_has_doubledash && return
2409 local subcommands="add status init deinit update summary foreach sync"
2410 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2413 __gitcomp "--quiet --cached"
2416 __gitcomp "$subcommands"
2426 init fetch clone rebase dcommit log find-rev
2427 set-tree commit-diff info create-ignore propget
2428 proplist show-ignore show-externals branch tag blame
2429 migrate mkdirs reset gc
2431 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2432 if [ -z "$subcommand" ]; then
2433 __gitcomp "$subcommands"
2435 local remote_opts="--username= --config-dir= --no-auth-cache"
2437 --follow-parent --authors-file= --repack=
2438 --no-metadata --use-svm-props --use-svnsync-props
2439 --log-window-size= --no-checkout --quiet
2440 --repack-flags --use-log-author --localtime
2441 --ignore-paths= --include-paths= $remote_opts
2444 --template= --shared= --trunk= --tags=
2445 --branches= --stdlayout --minimize-url
2446 --no-metadata --use-svm-props --use-svnsync-props
2447 --rewrite-root= --prefix= --use-log-author
2448 --add-author-from $remote_opts
2451 --edit --rmdir --find-copies-harder --copy-similarity=
2454 case "$subcommand,$cur" in
2456 __gitcomp "--revision= --fetch-all $fc_opts"
2459 __gitcomp "--revision= $fc_opts $init_opts"
2462 __gitcomp "$init_opts"
2466 --merge --strategy= --verbose --dry-run
2467 --fetch-all --no-rebase --commit-url
2468 --revision --interactive $cmt_opts $fc_opts
2472 __gitcomp "--stdin $cmt_opts $fc_opts"
2474 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
2475 show-externals,--*|mkdirs,--*)
2476 __gitcomp "--revision="
2480 --limit= --revision= --verbose --incremental
2481 --oneline --show-commit --non-recursive
2482 --authors-file= --color
2487 --merge --verbose --strategy= --local
2488 --fetch-all --dry-run $fc_opts
2492 __gitcomp "--message= --file= --revision= $cmt_opts"
2498 __gitcomp "--dry-run --message --tag"
2501 __gitcomp "--dry-run --message"
2504 __gitcomp "--git-format"
2508 --config-dir= --ignore-paths= --minimize
2509 --no-auth-cache --username=
2513 __gitcomp "--revision= --parent"
2524 while [ $c -lt $cword ]; do
2528 __gitcomp_nl "$(__git_tags)"
2543 __gitcomp_nl "$(__git_tags)"
2547 __gitcomp_nl "$(__git_refs)"
2559 local i c=1 command __git_dir
2561 while [ $c -lt $cword ]; do
2564 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2565 --git-dir) ((c++)) ; __git_dir="${words[c]}" ;;
2566 --bare) __git_dir="." ;;
2567 --help) command="help"; break ;;
2568 -c|--work-tree|--namespace) ((c++)) ;;
2570 *) command="$i"; break ;;
2575 if [ -z "$command" ]; then
2590 --no-replace-objects
2594 *) __git_compute_porcelain_commands
2595 __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
2600 local completion_func="_git_${command//-/_}"
2601 declare -f $completion_func >/dev/null && $completion_func && return
2603 local expansion=$(__git_aliased_command "$command")
2604 if [ -n "$expansion" ]; then
2606 completion_func="_git_${expansion//-/_}"
2607 declare -f $completion_func >/dev/null && $completion_func
2613 __git_has_doubledash && return
2615 local g="$(__gitdir)"
2617 if [ -f "$g/MERGE_HEAD" ]; then
2623 $__git_log_common_options
2624 $__git_log_gitk_options
2630 __git_complete_revlist
2633 if [[ -n ${ZSH_VERSION-} ]]; then
2634 echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
2636 autoload -U +X compinit && compinit
2642 local cur_="${3-$cur}"
2648 local c IFS=$' \t\n'
2656 array[${#array[@]}+1]="$c"
2659 compadd -Q -S '' -p "${2-}" -a -- array && _ret=0
2670 compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0
2679 compadd -Q -p "${2-}" -f -- ${=1} && _ret=0
2684 local _ret=1 cur cword prev
2685 cur=${words[CURRENT]}
2686 prev=${words[CURRENT-1]}
2688 emulate ksh -c __${service}_main
2689 let _ret && _default && _ret=0
2693 compdef _git git gitk
2699 local cur words cword prev
2700 _get_comp_words_by_ref -n =: cur words cword prev
2704 # Setup completion for certain functions defined above by setting common
2705 # variables and workarounds.
2706 # This is NOT a public function; use at your own risk.
2709 local wrapper="__git_wrap${2}"
2710 eval "$wrapper () { __git_func_wrap $2 ; }"
2711 complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \
2712 || complete -o default -o nospace -F $wrapper $1
2715 # wrapper for backwards compatibility
2718 __git_wrap__git_main
2721 # wrapper for backwards compatibility
2724 __git_wrap__gitk_main
2727 __git_complete git __git_main
2728 __git_complete gitk __gitk_main
2730 # The following are necessary only for Cygwin, and only are needed
2731 # when the user has tab-completed the executable name and consequently
2732 # included the '.exe' suffix.
2734 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
2735 __git_complete git.exe __git_main