3 # bash/zsh completion support for core Git.
5 # Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
6 # Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
7 # Distributed under the GNU General Public License, version 2.0.
9 # The contained completion routines provide support for completing:
11 # *) local and remote branch names
12 # *) local and remote tag names
13 # *) .git/remotes file names
14 # *) git 'subcommands'
15 # *) tree paths within 'ref:path/to/file' expressions
16 # *) file paths within current working directory and index
17 # *) common --long-options
19 # To use these routines:
21 # 1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
22 # 2) Add the following line to your .bashrc/.zshrc:
23 # source ~/.git-completion.sh
24 # 3) Consider changing your PS1 to also show the current branch,
25 # see git-prompt.sh for details.
27 case "$COMP_WORDBREAKS" in
29 *) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
32 # __gitdir accepts 0 or 1 arguments (i.e., location)
33 # returns location of .git repo
36 # Note: this function is duplicated in git-prompt.sh
37 # When updating it, make sure you update the other one to match.
38 if [ -z "${1-}" ]; then
39 if [ -n "${__git_dir-}" ]; then
41 elif [ -n "${GIT_DIR-}" ]; then
42 test -d "${GIT_DIR-}" || return 1
44 elif [ -d .git ]; then
47 git rev-parse --git-dir 2>/dev/null
49 elif [ -d "$1/.git" ]; then
56 # The following function is based on code from:
58 # bash_completion - programmable completion functions for bash 3.2+
60 # Copyright © 2006-2008, Ian Macdonald <ian@caliban.org>
61 # © 2009-2010, Bash Completion Maintainers
62 # <bash-completion-devel@lists.alioth.debian.org>
64 # This program is free software; you can redistribute it and/or modify
65 # it under the terms of the GNU General Public License as published by
66 # the Free Software Foundation; either version 2, or (at your option)
69 # This program is distributed in the hope that it will be useful,
70 # but WITHOUT ANY WARRANTY; without even the implied warranty of
71 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
72 # GNU General Public License for more details.
74 # You should have received a copy of the GNU General Public License
75 # along with this program; if not, write to the Free Software Foundation,
76 # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
78 # The latest version of this software can be obtained here:
80 # http://bash-completion.alioth.debian.org/
84 # This function can be used to access a tokenized list of words
85 # on the command line:
87 # __git_reassemble_comp_words_by_ref '=:'
88 # if test "${words_[cword_-1]}" = -w
93 # The argument should be a collection of characters from the list of
94 # word completion separators (COMP_WORDBREAKS) to treat as ordinary
97 # This is roughly equivalent to going back in time and setting
98 # COMP_WORDBREAKS to exclude those characters. The intent is to
99 # make option types like --date=<type> and <rev>:<path> easy to
100 # recognize by treating each shell word as a single token.
102 # It is best not to set COMP_WORDBREAKS directly because the value is
103 # shared with other completion scripts. By the time the completion
104 # function gets called, COMP_WORDS has already been populated so local
105 # changes to COMP_WORDBREAKS have no effect.
107 # Output: words_, cword_, cur_.
109 __git_reassemble_comp_words_by_ref()
111 local exclude i j first
112 # Which word separators to exclude?
113 exclude="${1//[^$COMP_WORDBREAKS]}"
115 if [ -z "$exclude" ]; then
116 words_=("${COMP_WORDS[@]}")
119 # List of word completion separators has shrunk;
120 # re-assemble words to complete.
121 for ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)); do
122 # Append each nonempty word consisting of just
123 # word separator characters to the current word.
127 [ -n "${COMP_WORDS[$i]}" ] &&
128 # word consists of excluded word separators
129 [ "${COMP_WORDS[$i]//[^$exclude]}" = "${COMP_WORDS[$i]}" ]
131 # Attach to the previous token,
132 # unless the previous token is the command name.
133 if [ $j -ge 2 ] && [ -n "$first" ]; then
137 words_[$j]=${words_[j]}${COMP_WORDS[i]}
138 if [ $i = $COMP_CWORD ]; then
141 if (($i < ${#COMP_WORDS[@]} - 1)); then
148 words_[$j]=${words_[j]}${COMP_WORDS[i]}
149 if [ $i = $COMP_CWORD ]; then
155 if ! type _get_comp_words_by_ref >/dev/null 2>&1; then
156 _get_comp_words_by_ref ()
158 local exclude cur_ words_ cword_
159 if [ "$1" = "-n" ]; then
163 __git_reassemble_comp_words_by_ref "$exclude"
164 cur_=${words_[cword_]}
165 while [ $# -gt 0 ]; do
171 prev=${words_[$cword_-1]}
174 words=("${words_[@]}")
189 if [[ "$x" == "$3"* ]]; then
190 COMPREPLY[i++]="$2$x$4"
195 # Generates completion reply, appending a space to possible completion words,
197 # It accepts 1 to 4 arguments:
198 # 1: List of possible completion words.
199 # 2: A prefix to be added to each possible completion word (optional).
200 # 3: Generate possible completion matches for this word (optional).
201 # 4: A suffix to be appended to each possible completion word (optional).
204 local cur_="${3-$cur}"
210 local c i=0 IFS=$' \t\n'
213 if [[ $c == "$cur_"* ]]; then
218 COMPREPLY[i++]="${2-}$c"
225 # Generates completion reply from newline-separated possible completion words
226 # by appending a space to all of them.
227 # It accepts 1 to 4 arguments:
228 # 1: List of possible completion words, separated by a single newline.
229 # 2: A prefix to be added to each possible completion word (optional).
230 # 3: Generate possible completion matches for this word (optional).
231 # 4: A suffix to be appended to each possible completion word instead of
232 # the default space (optional). If specified but empty, nothing is
237 __gitcompadd "$1" "${2-}" "${3-$cur}" "${4- }"
240 # Generates completion reply with compgen from newline-separated possible
241 # completion filenames.
242 # It accepts 1 to 3 arguments:
243 # 1: List of possible completion filenames, separated by a single newline.
244 # 2: A directory prefix to be added to each possible completion filename
246 # 3: Generate possible completion matches for this word (optional).
251 # XXX does not work when the directory prefix contains a tilde,
252 # since tilde expansion is not applied.
253 # This means that COMPREPLY will be empty and Bash default
254 # completion will be used.
255 __gitcompadd "$1" "${2-}" "${3-$cur}" ""
257 # use a hack to enable file mode in bash < 4
258 compopt -o filenames +o nospace 2>/dev/null ||
259 compgen -f /non-existing-dir/ > /dev/null
262 # Execute 'git ls-files', unless the --committable option is specified, in
263 # which case it runs 'git diff-index' to find out the files that can be
264 # committed. It return paths relative to the directory specified in the first
265 # argument, and using the options specified in the second argument.
266 __git_ls_files_helper ()
269 test -n "${CDPATH+set}" && unset CDPATH
271 if [ "$2" == "--committable" ]; then
272 git diff-index --name-only --relative HEAD
274 # NOTE: $2 is not quoted in order to support multiple options
275 git ls-files --exclude-standard $2
281 # __git_index_files accepts 1 or 2 arguments:
282 # 1: Options to pass to ls-files (required).
283 # 2: A directory path (optional).
284 # If provided, only files within the specified directory are listed.
285 # Sub directories are never recursed. Path must have a trailing
289 local dir="$(__gitdir)" root="${2-.}" file
291 if [ -d "$dir" ]; then
292 __git_ls_files_helper "$root" "$1" |
293 while read -r file; do
295 ?*/*) echo "${file%%/*}" ;;
304 local dir="$(__gitdir)"
305 if [ -d "$dir" ]; then
306 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
314 local dir="$(__gitdir)"
315 if [ -d "$dir" ]; then
316 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
322 # __git_refs accepts 0, 1 (to pass to __gitdir), or 2 arguments
323 # presence of 2nd argument means use the guess heuristic employed
324 # by checkout for tracking branches
327 local i hash dir="$(__gitdir "${1-}")" track="${2-}"
329 if [ -d "$dir" ]; then
337 for i in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD; do
338 if [ -e "$dir/$i" ]; then echo $i; fi
340 format="refname:short"
341 refs="refs/tags refs/heads refs/remotes"
344 git --git-dir="$dir" for-each-ref --format="%($format)" \
346 if [ -n "$track" ]; then
347 # employ the heuristic used by git checkout
348 # Try to find a remote branch that matches the completion word
349 # but only output if the branch name is unique
351 git --git-dir="$dir" for-each-ref --shell --format="ref=%(refname:short)" \
353 while read -r entry; do
356 if [[ "$ref" == "$cur"* ]]; then
359 done | sort | uniq -u
365 git ls-remote "$dir" "$cur*" 2>/dev/null | \
366 while read -r hash i; do
375 git for-each-ref --format="%(refname:short)" -- "refs/remotes/$dir/" | sed -e "s#^$dir/##"
380 # __git_refs2 requires 1 argument (to pass to __git_refs)
384 for i in $(__git_refs "$1"); do
389 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
390 __git_refs_remotes ()
393 git ls-remote "$1" 'refs/heads/*' 2>/dev/null | \
394 while read -r hash i; do
395 echo "$i:refs/remotes/$1/${i#refs/heads/}"
401 local i IFS=$'\n' d="$(__gitdir)"
402 test -d "$d/remotes" && ls -1 "$d/remotes"
403 for i in $(git --git-dir="$d" config --get-regexp 'remote\..*\.url' 2>/dev/null); do
409 __git_list_merge_strategies ()
411 git merge -s help 2>&1 |
412 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
421 __git_merge_strategies=
422 # 'git merge -s help' (and thus detection of the merge strategy
423 # list) fails, unfortunately, if run outside of any git working
424 # tree. __git_merge_strategies is set to the empty string in
425 # that case, and the detection will be repeated the next time it
427 __git_compute_merge_strategies ()
429 test -n "$__git_merge_strategies" ||
430 __git_merge_strategies=$(__git_list_merge_strategies)
433 __git_complete_revlist_file ()
435 local pfx ls ref cur_="$cur"
455 case "$COMP_WORDBREAKS" in
457 *) pfx="$ref:$pfx" ;;
460 __gitcomp_nl "$(git --git-dir="$(__gitdir)" ls-tree "$ls" 2>/dev/null \
461 | sed '/^100... blob /{
477 pfx="${cur_%...*}..."
479 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
484 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
487 __gitcomp_nl "$(__git_refs)"
493 # __git_complete_index_file requires 1 argument:
494 # 1: the options to pass to ls-file
496 # The exception is --committable, which finds the files appropriate commit.
497 __git_complete_index_file ()
499 local pfx="" cur_="$cur"
509 __gitcomp_file "$(__git_index_files "$1" "$pfx")" "$pfx" "$cur_"
512 __git_complete_file ()
514 __git_complete_revlist_file
517 __git_complete_revlist ()
519 __git_complete_revlist_file
522 __git_complete_remote_or_refspec ()
524 local cur_="$cur" cmd="${words[1]}"
525 local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0
526 if [ "$cmd" = "remote" ]; then
529 while [ $c -lt $cword ]; do
532 --mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
535 push) no_complete_refspec=1 ;;
543 *) remote="$i"; break ;;
547 if [ -z "$remote" ]; then
548 __gitcomp_nl "$(__git_remotes)"
551 if [ $no_complete_refspec = 1 ]; then
554 [ "$remote" = "." ] && remote=
557 case "$COMP_WORDBREAKS" in
559 *) pfx="${cur_%%:*}:" ;;
571 if [ $lhs = 1 ]; then
572 __gitcomp_nl "$(__git_refs2 "$remote")" "$pfx" "$cur_"
574 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
578 if [ $lhs = 1 ]; then
579 __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
581 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
585 if [ $lhs = 1 ]; then
586 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
588 __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
594 __git_complete_strategy ()
596 __git_compute_merge_strategies
599 __gitcomp "$__git_merge_strategies"
604 __gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}"
612 if test -n "${GIT_TESTING_COMMAND_COMPLETION:-}"
614 printf "%s" "${GIT_TESTING_COMMAND_COMPLETION}"
616 git help -a|egrep '^ [a-zA-Z0-9]'
620 __git_list_all_commands ()
623 for i in $(__git_commands)
626 *--*) : helper pattern;;
633 __git_compute_all_commands ()
635 test -n "$__git_all_commands" ||
636 __git_all_commands=$(__git_list_all_commands)
639 __git_list_porcelain_commands ()
642 __git_compute_all_commands
643 for i in $__git_all_commands
646 *--*) : helper pattern;;
647 applymbox) : ask gittus;;
648 applypatch) : ask gittus;;
649 archimport) : import;;
650 cat-file) : plumbing;;
651 check-attr) : plumbing;;
652 check-ignore) : plumbing;;
653 check-ref-format) : plumbing;;
654 checkout-index) : plumbing;;
655 commit-tree) : plumbing;;
656 count-objects) : infrequent;;
657 credential-cache) : credentials helper;;
658 credential-store) : credentials helper;;
659 cvsexportcommit) : export;;
660 cvsimport) : import;;
661 cvsserver) : daemon;;
663 diff-files) : plumbing;;
664 diff-index) : plumbing;;
665 diff-tree) : plumbing;;
666 fast-import) : import;;
667 fast-export) : export;;
668 fsck-objects) : plumbing;;
669 fetch-pack) : plumbing;;
670 fmt-merge-msg) : plumbing;;
671 for-each-ref) : plumbing;;
672 hash-object) : plumbing;;
673 http-*) : transport;;
674 index-pack) : plumbing;;
675 init-db) : deprecated;;
676 local-fetch) : plumbing;;
677 lost-found) : infrequent;;
678 ls-files) : plumbing;;
679 ls-remote) : plumbing;;
680 ls-tree) : plumbing;;
681 mailinfo) : plumbing;;
682 mailsplit) : plumbing;;
683 merge-*) : plumbing;;
686 pack-objects) : plumbing;;
687 pack-redundant) : plumbing;;
688 pack-refs) : plumbing;;
689 parse-remote) : plumbing;;
690 patch-id) : plumbing;;
691 peek-remote) : plumbing;;
693 prune-packed) : plumbing;;
694 quiltimport) : import;;
695 read-tree) : plumbing;;
696 receive-pack) : plumbing;;
697 remote-*) : transport;;
698 repo-config) : deprecated;;
700 rev-list) : plumbing;;
701 rev-parse) : plumbing;;
702 runstatus) : plumbing;;
703 sh-setup) : internal;;
705 show-ref) : plumbing;;
706 send-pack) : plumbing;;
707 show-index) : plumbing;;
709 stripspace) : plumbing;;
710 symbolic-ref) : plumbing;;
711 tar-tree) : deprecated;;
712 unpack-file) : plumbing;;
713 unpack-objects) : plumbing;;
714 update-index) : plumbing;;
715 update-ref) : plumbing;;
716 update-server-info) : daemon;;
717 upload-archive) : plumbing;;
718 upload-pack) : plumbing;;
719 write-tree) : plumbing;;
721 verify-pack) : infrequent;;
722 verify-tag) : plumbing;;
728 __git_porcelain_commands=
729 __git_compute_porcelain_commands ()
731 __git_compute_all_commands
732 test -n "$__git_porcelain_commands" ||
733 __git_porcelain_commands=$(__git_list_porcelain_commands)
736 __git_pretty_aliases ()
739 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "pretty\..*" 2>/dev/null); do
752 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "alias\..*" 2>/dev/null); do
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 ;;
784 # __git_find_on_cmdline requires 1 argument
785 __git_find_on_cmdline ()
787 local word subcommand c=1
788 while [ $c -lt $cword ]; do
790 for subcommand in $1; do
791 if [ "$subcommand" = "$word" ]; then
800 __git_has_doubledash ()
803 while [ $c -lt $cword ]; do
804 if [ "--" = "${words[c]}" ]; then
812 # Try to count non option arguments passed on the command line for the
813 # specified git command.
814 # When options are used, it is necessary to use the special -- option to
815 # tell the implementation were non option arguments begin.
816 # XXX this can not be improved, since options can appear everywhere, as
820 # __git_count_arguments requires 1 argument: the git command executed.
821 __git_count_arguments ()
825 # Skip "git" (first argument)
826 for ((i=1; i < ${#words[@]}; i++)); do
831 # Good; we can assume that the following are only non
836 # Skip the specified git command and discard git
849 __git_whitespacelist="nowarn warn error error-all fix"
853 local dir="$(__gitdir)"
854 if [ -d "$dir"/rebase-apply ]; then
855 __gitcomp "--skip --continue --resolved --abort"
860 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
865 --3way --committer-date-is-author-date --ignore-date
866 --ignore-whitespace --ignore-space-change
867 --interactive --keep --no-utf8 --signoff --utf8
868 --whitespace= --scissors
878 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
883 --stat --numstat --summary --check --index
884 --cached --index-info --reverse --reject --unidiff-zero
885 --apply --no-add --exclude=
886 --ignore-whitespace --ignore-space-change
887 --whitespace= --inaccurate-eof --verbose
898 --interactive --refresh --patch --update --dry-run
899 --ignore-errors --intent-to-add
904 # XXX should we check for --update and --all options ?
905 __git_complete_index_file "--others --modified"
912 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
916 __gitcomp_nl "$(__git_remotes)" "" "${cur##--remote=}"
921 --format= --list --verbose
922 --prefix= --remote= --exec=
932 __git_has_doubledash && return
934 local subcommands="start bad good skip reset visualize replay log run"
935 local subcommand="$(__git_find_on_cmdline "$subcommands")"
936 if [ -z "$subcommand" ]; then
937 if [ -f "$(__gitdir)"/BISECT_START ]; then
938 __gitcomp "$subcommands"
940 __gitcomp "replay start"
945 case "$subcommand" in
946 bad|good|reset|skip|start)
947 __gitcomp_nl "$(__git_refs)"
956 local i c=1 only_local_ref="n" has_r="n"
958 while [ $c -lt $cword ]; do
961 -d|-m) only_local_ref="y" ;;
969 __gitcomp "$(__git_refs)" "" "${cur##--set-upstream-to=}"
973 --color --no-color --verbose --abbrev= --no-abbrev
974 --track --no-track --contains --merged --no-merged
975 --set-upstream-to= --edit-description --list
980 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
981 __gitcomp_nl "$(__git_heads)"
983 __gitcomp_nl "$(__git_refs)"
991 local cmd="${words[2]}"
994 __gitcomp "create list-heads verify unbundle"
1002 __git_complete_revlist
1011 __git_has_doubledash && return
1015 __gitcomp "diff3 merge" "" "${cur##--conflict=}"
1019 --quiet --ours --theirs --track --no-track --merge
1020 --conflict= --orphan --patch
1024 # check if --track, --no-track, or --no-guess was specified
1025 # if so, disable DWIM mode
1026 local flags="--track --no-track --no-guess" track=1
1027 if [ -n "$(__git_find_on_cmdline "$flags")" ]; then
1030 __gitcomp_nl "$(__git_refs '' $track)"
1037 __gitcomp "$(__git_refs)"
1042 local dir="$(__gitdir)"
1043 if [ -f "$dir"/CHERRY_PICK_HEAD ]; then
1044 __gitcomp "--continue --quit --abort"
1049 __gitcomp "--edit --no-commit --signoff --strategy= --mainline"
1052 __gitcomp_nl "$(__git_refs)"
1061 __gitcomp "--dry-run --quiet"
1066 # XXX should we check for -x option ?
1067 __git_complete_index_file "--others"
1099 __gitcomp_nl "$(__git_refs)" "" "${cur}"
1106 __gitcomp "default strip verbatim whitespace
1107 " "" "${cur##--cleanup=}"
1110 --reuse-message=*|--reedit-message=*|\
1111 --fixup=*|--squash=*)
1112 __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1115 --untracked-files=*)
1116 __gitcomp "all no normal" "" "${cur##--untracked-files=}"
1121 --all --author= --signoff --verify --no-verify
1123 --amend --include --only --interactive
1124 --dry-run --reuse-message= --reedit-message=
1125 --reset-author --file= --message= --template=
1126 --cleanup= --untracked-files --untracked-files=
1127 --verbose --quiet --fixup= --squash=
1132 if git rev-parse --verify --quiet HEAD >/dev/null; then
1133 __git_complete_index_file "--committable"
1135 # This is the first commit
1136 __git_complete_index_file "--cached"
1145 --all --tags --contains --abbrev= --candidates=
1146 --exact-match --debug --long --match --always
1150 __gitcomp_nl "$(__git_refs)"
1153 __git_diff_algorithms="myers minimal patience histogram"
1155 __git_diff_common_options="--stat --numstat --shortstat --summary
1156 --patch-with-stat --name-only --name-status --color
1157 --no-color --color-words --no-renames --check
1158 --full-index --binary --abbrev --diff-filter=
1159 --find-copies-harder
1160 --text --ignore-space-at-eol --ignore-space-change
1161 --ignore-all-space --exit-code --quiet --ext-diff
1163 --no-prefix --src-prefix= --dst-prefix=
1164 --inter-hunk-context=
1165 --patience --histogram --minimal
1167 --dirstat --dirstat= --dirstat-by-file
1168 --dirstat-by-file= --cumulative
1174 __git_has_doubledash && return
1178 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
1182 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1183 --base --ours --theirs --no-index
1184 $__git_diff_common_options
1189 __git_complete_revlist_file
1192 __git_mergetools_common="diffuse ecmerge emerge kdiff3 meld opendiff
1193 tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc3 codecompare
1198 __git_has_doubledash && return
1202 __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
1206 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1207 --base --ours --theirs
1208 --no-renames --diff-filter= --find-copies-harder
1209 --relative --ignore-submodules
1214 __git_complete_revlist_file
1217 __git_fetch_options="
1218 --quiet --verbose --append --upload-pack --force --keep --depth=
1219 --tags --no-tags --all --prune --dry-run
1226 __gitcomp "$__git_fetch_options"
1230 __git_complete_remote_or_refspec
1233 __git_format_patch_options="
1234 --stdout --attach --no-attach --thread --thread= --no-thread
1235 --numbered --start-number --numbered-files --keep-subject --signoff
1236 --signature --no-signature --in-reply-to= --cc= --full-index --binary
1237 --not --all --cover-letter --no-prefix --src-prefix= --dst-prefix=
1238 --inline --suffix= --ignore-if-in-upstream --subject-prefix=
1239 --output-directory --reroll-count --to= --quiet --notes
1242 _git_format_patch ()
1248 " "" "${cur##--thread=}"
1252 __gitcomp "$__git_format_patch_options"
1256 __git_complete_revlist
1264 --tags --root --unreachable --cache --no-reflogs --full
1265 --strict --verbose --lost-found
1276 __gitcomp "--prune --aggressive"
1287 __git_match_ctag() {
1288 awk "/^${1////\\/}/ { print \$1 }" "$2"
1293 __git_has_doubledash && return
1299 --text --ignore-case --word-regexp --invert-match
1300 --full-name --line-number
1301 --extended-regexp --basic-regexp --fixed-strings
1303 --files-with-matches --name-only
1304 --files-without-match
1307 --and --or --not --all-match
1313 case "$cword,$prev" in
1315 if test -r tags; then
1316 __gitcomp_nl "$(__git_match_ctag "$cur" tags)"
1322 __gitcomp_nl "$(__git_refs)"
1329 __gitcomp "--all --info --man --web"
1333 __git_compute_all_commands
1334 __gitcomp "$__git_all_commands $(__git_aliases)
1335 attributes cli core-tutorial cvs-migration
1336 diffcore gitk glossary hooks ignore modules
1337 namespaces repository-layout tutorial tutorial-2
1347 false true umask group all world everybody
1348 " "" "${cur##--shared=}"
1352 __gitcomp "--quiet --bare --template= --shared --shared="
1362 __gitcomp "--cached --deleted --modified --others --ignored
1363 --stage --directory --no-empty-directory --unmerged
1364 --killed --exclude= --exclude-from=
1365 --exclude-per-directory= --exclude-standard
1366 --error-unmatch --with-tree= --full-name
1367 --abbrev --ignored --exclude-per-directory
1373 # XXX ignore options like --modified and always suggest all cached
1375 __git_complete_index_file "--cached"
1380 __gitcomp_nl "$(__git_remotes)"
1388 # Options that go well for log, shortlog and gitk
1389 __git_log_common_options="
1391 --branches --tags --remotes
1392 --first-parent --merges --no-merges
1394 --max-age= --since= --after=
1395 --min-age= --until= --before=
1396 --min-parents= --max-parents=
1397 --no-min-parents --no-max-parents
1399 # Options that go well for log and gitk (not shortlog)
1400 __git_log_gitk_options="
1401 --dense --sparse --full-history
1402 --simplify-merges --simplify-by-decoration
1403 --left-right --notes --no-notes
1405 # Options that go well for log and shortlog (not gitk)
1406 __git_log_shortlog_options="
1407 --author= --committer= --grep=
1411 __git_log_pretty_formats="oneline short medium full fuller email raw format:"
1412 __git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1416 __git_has_doubledash && return
1418 local g="$(git rev-parse --git-dir 2>/dev/null)"
1420 if [ -f "$g/MERGE_HEAD" ]; then
1424 --pretty=*|--format=*)
1425 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
1430 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1434 __gitcomp "long short" "" "${cur##--decorate=}"
1439 $__git_log_common_options
1440 $__git_log_shortlog_options
1441 $__git_log_gitk_options
1442 --root --topo-order --date-order --reverse
1443 --follow --full-diff
1444 --abbrev-commit --abbrev=
1445 --relative-date --date=
1446 --pretty= --format= --oneline
1449 --decorate --decorate=
1451 --parents --children
1453 $__git_diff_common_options
1454 --pickaxe-all --pickaxe-regex
1459 __git_complete_revlist
1462 __git_merge_options="
1463 --no-commit --no-stat --log --no-log --squash --strategy
1464 --commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit
1469 __git_complete_strategy && return
1473 __gitcomp "$__git_merge_options"
1476 __gitcomp_nl "$(__git_refs)"
1483 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1495 __gitcomp_nl "$(__git_refs)"
1502 __gitcomp "--dry-run"
1507 if [ $(__git_count_arguments "mv") -gt 0 ]; then
1508 # We need to show both cached and untracked files (including
1509 # empty directories) since this may not be the last argument.
1510 __git_complete_index_file "--cached --others --directory"
1512 __git_complete_index_file "--cached"
1518 __gitcomp "--tags --all --stdin"
1523 local subcommands='add append copy edit list prune remove show'
1524 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1526 case "$subcommand,$cur" in
1533 __gitcomp_nl "$(__git_refs)"
1536 __gitcomp "$subcommands --ref"
1540 add,--reuse-message=*|append,--reuse-message=*|\
1541 add,--reedit-message=*|append,--reedit-message=*)
1542 __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1545 __gitcomp '--file= --message= --reedit-message=
1552 __gitcomp '--dry-run --verbose'
1561 __gitcomp_nl "$(__git_refs)"
1570 __git_complete_strategy && return
1575 --rebase --no-rebase
1576 $__git_merge_options
1577 $__git_fetch_options
1582 __git_complete_remote_or_refspec
1589 __gitcomp_nl "$(__git_remotes)"
1594 __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}"
1599 --all --mirror --tags --dry-run --force --verbose
1600 --receive-pack= --repo= --set-upstream
1605 __git_complete_remote_or_refspec
1610 local dir="$(__gitdir)"
1611 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1612 __gitcomp "--continue --skip --abort"
1615 __git_complete_strategy && return
1618 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1623 --onto --merge --strategy --interactive
1624 --preserve-merges --stat --no-stat
1625 --committer-date-is-author-date --ignore-date
1626 --ignore-whitespace --whitespace=
1632 __gitcomp_nl "$(__git_refs)"
1637 local subcommands="show delete expire"
1638 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1640 if [ -z "$subcommand" ]; then
1641 __gitcomp "$subcommands"
1643 __gitcomp_nl "$(__git_refs)"
1647 __git_send_email_confirm_options="always never auto cc compose"
1648 __git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
1655 $__git_send_email_confirm_options
1656 " "" "${cur##--confirm=}"
1661 $__git_send_email_suppresscc_options
1662 " "" "${cur##--suppress-cc=}"
1666 --smtp-encryption=*)
1667 __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1673 " "" "${cur##--thread=}"
1677 __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1678 --compose --confirm= --dry-run --envelope-sender
1680 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1681 --no-suppress-from --no-thread --quiet
1682 --signed-off-by-cc --smtp-pass --smtp-server
1683 --smtp-server-port --smtp-encryption= --smtp-user
1684 --subject --suppress-cc= --suppress-from --thread --to
1685 --validate --no-validate
1686 $__git_format_patch_options"
1690 __git_complete_revlist
1698 __git_config_get_set_variables ()
1700 local prevword word config_file= c=$cword
1701 while [ $c -gt 1 ]; do
1704 --system|--global|--local|--file=*)
1709 config_file="$word $prevword"
1717 git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null |
1731 branch.*.remote|branch.*.pushremote)
1732 __gitcomp_nl "$(__git_remotes)"
1736 __gitcomp_nl "$(__git_refs)"
1740 __gitcomp "false true"
1744 __gitcomp_nl "$(__git_remotes)"
1748 local remote="${prev#remote.}"
1749 remote="${remote%.fetch}"
1750 if [ -z "$cur" ]; then
1751 __gitcomp_nl "refs/heads/" "" "" ""
1754 __gitcomp_nl "$(__git_refs_remotes "$remote")"
1758 local remote="${prev#remote.}"
1759 remote="${remote%.push}"
1760 __gitcomp_nl "$(git --git-dir="$(__gitdir)" \
1761 for-each-ref --format='%(refname):%(refname)' \
1765 pull.twohead|pull.octopus)
1766 __git_compute_merge_strategies
1767 __gitcomp "$__git_merge_strategies"
1770 color.branch|color.diff|color.interactive|\
1771 color.showbranch|color.status|color.ui)
1772 __gitcomp "always never auto"
1776 __gitcomp "false true"
1781 normal black red green yellow blue magenta cyan white
1782 bold dim ul blink reverse
1787 __gitcomp "log short"
1791 __gitcomp "man info web html"
1795 __gitcomp "$__git_log_date_formats"
1798 sendemail.aliasesfiletype)
1799 __gitcomp "mutt mailrc pine elm gnus"
1803 __gitcomp "$__git_send_email_confirm_options"
1806 sendemail.suppresscc)
1807 __gitcomp "$__git_send_email_suppresscc_options"
1810 --get|--get-all|--unset|--unset-all)
1811 __gitcomp_nl "$(__git_config_get_set_variables)"
1821 --system --global --local --file=
1822 --list --replace-all
1823 --get --get-all --get-regexp
1824 --add --unset --unset-all
1825 --remove-section --rename-section
1830 local pfx="${cur%.*}." cur_="${cur##*.}"
1831 __gitcomp "remote pushremote merge mergeoptions rebase" "$pfx" "$cur_"
1835 local pfx="${cur%.*}." cur_="${cur#*.}"
1836 __gitcomp_nl "$(__git_heads)" "$pfx" "$cur_" "."
1840 local pfx="${cur%.*}." cur_="${cur##*.}"
1842 argprompt cmd confirm needsfile noconsole norescan
1843 prompt revprompt revunmerged title
1848 local pfx="${cur%.*}." cur_="${cur##*.}"
1849 __gitcomp "cmd path" "$pfx" "$cur_"
1853 local pfx="${cur%.*}." cur_="${cur##*.}"
1854 __gitcomp "cmd path" "$pfx" "$cur_"
1858 local pfx="${cur%.*}." cur_="${cur##*.}"
1859 __gitcomp "cmd path trustExitCode" "$pfx" "$cur_"
1863 local pfx="${cur%.*}." cur_="${cur#*.}"
1864 __git_compute_all_commands
1865 __gitcomp_nl "$__git_all_commands" "$pfx" "$cur_"
1869 local pfx="${cur%.*}." cur_="${cur##*.}"
1871 url proxy fetch push mirror skipDefaultUpdate
1872 receivepack uploadpack tagopt pushurl
1877 local pfx="${cur%.*}." cur_="${cur#*.}"
1878 __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
1882 local pfx="${cur%.*}." cur_="${cur##*.}"
1883 __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_"
1889 advice.commitBeforeMerge
1891 advice.implicitIdentity
1892 advice.pushNonFastForward
1893 advice.resolveConflict
1897 apply.ignorewhitespace
1899 branch.autosetupmerge
1900 branch.autosetuprebase
1904 color.branch.current
1909 color.decorate.branch
1910 color.decorate.remoteBranch
1911 color.decorate.stash
1921 color.diff.whitespace
1926 color.grep.linenumber
1929 color.grep.separator
1931 color.interactive.error
1932 color.interactive.header
1933 color.interactive.help
1934 color.interactive.prompt
1939 color.status.changed
1941 color.status.nobranch
1942 color.status.untracked
1943 color.status.updated
1952 core.bigFileThreshold
1955 core.deltaBaseCacheLimit
1960 core.fsyncobjectfiles
1962 core.ignoreCygwinFSTricks
1965 core.logAllRefUpdates
1966 core.loosecompression
1969 core.packedGitWindowSize
1971 core.preferSymlinkRefs
1974 core.repositoryFormatVersion
1976 core.sharedRepository
1980 core.warnAmbiguousRefs
1983 diff.autorefreshindex
1985 diff.ignoreSubmodules
1992 diff.suppressBlankEmpty
1998 fetch.recurseSubmodules
2007 format.subjectprefix
2018 gc.reflogexpireunreachable
2022 gitcvs.commitmsgannotation
2023 gitcvs.dbTableNamePrefix
2034 gui.copyblamethreshold
2038 gui.matchtrackingbranch
2039 gui.newbranchtemplate
2040 gui.pruneduringfetch
2041 gui.spellingdictionary
2056 http.sslCertPasswordProtected
2061 i18n.logOutputEncoding
2067 imap.preformattedHTML
2077 interactive.singlekey
2093 mergetool.keepBackup
2094 mergetool.keepTemporaries
2099 notes.rewrite.rebase
2103 pack.deltaCacheLimit
2119 receive.denyCurrentBranch
2120 receive.denyDeleteCurrent
2122 receive.denyNonFastForwards
2125 receive.updateserverinfo
2128 repack.usedeltabaseoffset
2132 sendemail.aliasesfile
2133 sendemail.aliasfiletype
2137 sendemail.chainreplyto
2139 sendemail.envelopesender
2143 sendemail.signedoffbycc
2144 sendemail.smtpdomain
2145 sendemail.smtpencryption
2147 sendemail.smtpserver
2148 sendemail.smtpserveroption
2149 sendemail.smtpserverport
2151 sendemail.suppresscc
2152 sendemail.suppressfrom
2157 status.relativePaths
2158 status.showUntrackedFiles
2159 status.submodulesummary
2162 transfer.unpackLimit
2174 local subcommands="add rename remove set-head set-branches set-url show prune update"
2175 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2176 if [ -z "$subcommand" ]; then
2177 __gitcomp "$subcommands"
2181 case "$subcommand" in
2182 rename|remove|set-url|show|prune)
2183 __gitcomp_nl "$(__git_remotes)"
2185 set-head|set-branches)
2186 __git_complete_remote_or_refspec
2189 local i c='' IFS=$'\n'
2190 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "remotes\..*" 2>/dev/null); do
2203 __gitcomp_nl "$(__git_refs)"
2208 __git_has_doubledash && return
2212 __gitcomp "--merge --mixed --hard --soft --patch"
2216 __gitcomp_nl "$(__git_refs)"
2223 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
2227 __gitcomp_nl "$(__git_refs)"
2234 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
2239 __git_complete_index_file "--cached"
2244 __git_has_doubledash && return
2249 $__git_log_common_options
2250 $__git_log_shortlog_options
2251 --numbered --summary
2256 __git_complete_revlist
2261 __git_has_doubledash && return
2264 --pretty=*|--format=*)
2265 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
2270 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
2274 __gitcomp "--pretty= --format= --abbrev-commit --oneline
2275 $__git_diff_common_options
2280 __git_complete_revlist_file
2288 --all --remotes --topo-order --current --more=
2289 --list --independent --merge-base --no-name
2291 --sha1-name --sparse --topics --reflog
2296 __git_complete_revlist
2301 local save_opts='--keep-index --no-keep-index --quiet --patch'
2302 local subcommands='save list show apply clear drop pop create branch'
2303 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2304 if [ -z "$subcommand" ]; then
2307 __gitcomp "$save_opts"
2310 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2311 __gitcomp "$subcommands"
2316 case "$subcommand,$cur" in
2318 __gitcomp "$save_opts"
2321 __gitcomp "--index --quiet"
2323 show,--*|drop,--*|branch,--*)
2325 show,*|apply,*|drop,*|pop,*|branch,*)
2326 __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
2327 | sed -n -e 's/:.*//p')"
2337 __git_has_doubledash && return
2339 local subcommands="add status init deinit update summary foreach sync"
2340 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2343 __gitcomp "--quiet --cached"
2346 __gitcomp "$subcommands"
2356 init fetch clone rebase dcommit log find-rev
2357 set-tree commit-diff info create-ignore propget
2358 proplist show-ignore show-externals branch tag blame
2359 migrate mkdirs reset gc
2361 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2362 if [ -z "$subcommand" ]; then
2363 __gitcomp "$subcommands"
2365 local remote_opts="--username= --config-dir= --no-auth-cache"
2367 --follow-parent --authors-file= --repack=
2368 --no-metadata --use-svm-props --use-svnsync-props
2369 --log-window-size= --no-checkout --quiet
2370 --repack-flags --use-log-author --localtime
2371 --ignore-paths= --include-paths= $remote_opts
2374 --template= --shared= --trunk= --tags=
2375 --branches= --stdlayout --minimize-url
2376 --no-metadata --use-svm-props --use-svnsync-props
2377 --rewrite-root= --prefix= --use-log-author
2378 --add-author-from $remote_opts
2381 --edit --rmdir --find-copies-harder --copy-similarity=
2384 case "$subcommand,$cur" in
2386 __gitcomp "--revision= --fetch-all $fc_opts"
2389 __gitcomp "--revision= $fc_opts $init_opts"
2392 __gitcomp "$init_opts"
2396 --merge --strategy= --verbose --dry-run
2397 --fetch-all --no-rebase --commit-url
2398 --revision --interactive $cmt_opts $fc_opts
2402 __gitcomp "--stdin $cmt_opts $fc_opts"
2404 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
2405 show-externals,--*|mkdirs,--*)
2406 __gitcomp "--revision="
2410 --limit= --revision= --verbose --incremental
2411 --oneline --show-commit --non-recursive
2412 --authors-file= --color
2417 --merge --verbose --strategy= --local
2418 --fetch-all --dry-run $fc_opts
2422 __gitcomp "--message= --file= --revision= $cmt_opts"
2428 __gitcomp "--dry-run --message --tag"
2431 __gitcomp "--dry-run --message"
2434 __gitcomp "--git-format"
2438 --config-dir= --ignore-paths= --minimize
2439 --no-auth-cache --username=
2443 __gitcomp "--revision= --parent"
2454 while [ $c -lt $cword ]; do
2458 __gitcomp_nl "$(__git_tags)"
2473 __gitcomp_nl "$(__git_tags)"
2477 __gitcomp_nl "$(__git_refs)"
2489 local i c=1 command __git_dir
2491 while [ $c -lt $cword ]; do
2494 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2495 --git-dir) ((c++)) ; __git_dir="${words[c]}" ;;
2496 --bare) __git_dir="." ;;
2497 --help) command="help"; break ;;
2498 -c|--work-tree|--namespace) ((c++)) ;;
2500 *) command="$i"; break ;;
2505 if [ -z "$command" ]; then
2520 --no-replace-objects
2524 *) __git_compute_porcelain_commands
2525 __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
2530 local completion_func="_git_${command//-/_}"
2531 declare -f $completion_func >/dev/null && $completion_func && return
2533 local expansion=$(__git_aliased_command "$command")
2534 if [ -n "$expansion" ]; then
2535 completion_func="_git_${expansion//-/_}"
2536 declare -f $completion_func >/dev/null && $completion_func
2542 __git_has_doubledash && return
2544 local g="$(__gitdir)"
2546 if [ -f "$g/MERGE_HEAD" ]; then
2552 $__git_log_common_options
2553 $__git_log_gitk_options
2559 __git_complete_revlist
2562 if [[ -n ${ZSH_VERSION-} ]]; then
2563 echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
2565 autoload -U +X compinit && compinit
2571 local cur_="${3-$cur}"
2577 local c IFS=$' \t\n'
2588 compadd -Q -S '' -p "${2-}" -a -- array && _ret=0
2599 compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0
2608 compadd -Q -p "${2-}" -f -- ${=1} && _ret=0
2613 local _ret=1 cur cword prev
2614 cur=${words[CURRENT]}
2615 prev=${words[CURRENT-1]}
2617 emulate ksh -c __${service}_main
2618 let _ret && _default && _ret=0
2622 compdef _git git gitk
2628 local cur words cword prev
2629 _get_comp_words_by_ref -n =: cur words cword prev
2633 # Setup completion for certain functions defined above by setting common
2634 # variables and workarounds.
2635 # This is NOT a public function; use at your own risk.
2638 local wrapper="__git_wrap${2}"
2639 eval "$wrapper () { __git_func_wrap $2 ; }"
2640 complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \
2641 || complete -o default -o nospace -F $wrapper $1
2644 # wrapper for backwards compatibility
2647 __git_wrap__git_main
2650 # wrapper for backwards compatibility
2653 __git_wrap__gitk_main
2656 __git_complete git __git_main
2657 __git_complete gitk __gitk_main
2659 # The following are necessary only for Cygwin, and only are needed
2660 # when the user has tab-completed the executable name and consequently
2661 # included the '.exe' suffix.
2663 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
2664 __git_complete git.exe __git_main