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 if [ -z "${1-}" ]; then
37 if [ -n "${__git_dir-}" ]; then
39 elif [ -n "${GIT_DIR-}" ]; then
40 test -d "${GIT_DIR-}" || return 1
42 elif [ -d .git ]; then
45 git rev-parse --git-dir 2>/dev/null
47 elif [ -d "$1/.git" ]; then
54 # The following function is based on code from:
56 # bash_completion - programmable completion functions for bash 3.2+
58 # Copyright © 2006-2008, Ian Macdonald <ian@caliban.org>
59 # © 2009-2010, Bash Completion Maintainers
60 # <bash-completion-devel@lists.alioth.debian.org>
62 # This program is free software; you can redistribute it and/or modify
63 # it under the terms of the GNU General Public License as published by
64 # the Free Software Foundation; either version 2, or (at your option)
67 # This program is distributed in the hope that it will be useful,
68 # but WITHOUT ANY WARRANTY; without even the implied warranty of
69 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
70 # GNU General Public License for more details.
72 # You should have received a copy of the GNU General Public License
73 # along with this program; if not, write to the Free Software Foundation,
74 # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
76 # The latest version of this software can be obtained here:
78 # http://bash-completion.alioth.debian.org/
82 # This function can be used to access a tokenized list of words
83 # on the command line:
85 # __git_reassemble_comp_words_by_ref '=:'
86 # if test "${words_[cword_-1]}" = -w
91 # The argument should be a collection of characters from the list of
92 # word completion separators (COMP_WORDBREAKS) to treat as ordinary
95 # This is roughly equivalent to going back in time and setting
96 # COMP_WORDBREAKS to exclude those characters. The intent is to
97 # make option types like --date=<type> and <rev>:<path> easy to
98 # recognize by treating each shell word as a single token.
100 # It is best not to set COMP_WORDBREAKS directly because the value is
101 # shared with other completion scripts. By the time the completion
102 # function gets called, COMP_WORDS has already been populated so local
103 # changes to COMP_WORDBREAKS have no effect.
105 # Output: words_, cword_, cur_.
107 __git_reassemble_comp_words_by_ref()
109 local exclude i j first
110 # Which word separators to exclude?
111 exclude="${1//[^$COMP_WORDBREAKS]}"
113 if [ -z "$exclude" ]; then
114 words_=("${COMP_WORDS[@]}")
117 # List of word completion separators has shrunk;
118 # re-assemble words to complete.
119 for ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)); do
120 # Append each nonempty word consisting of just
121 # word separator characters to the current word.
125 [ -n "${COMP_WORDS[$i]}" ] &&
126 # word consists of excluded word separators
127 [ "${COMP_WORDS[$i]//[^$exclude]}" = "${COMP_WORDS[$i]}" ]
129 # Attach to the previous token,
130 # unless the previous token is the command name.
131 if [ $j -ge 2 ] && [ -n "$first" ]; then
135 words_[$j]=${words_[j]}${COMP_WORDS[i]}
136 if [ $i = $COMP_CWORD ]; then
139 if (($i < ${#COMP_WORDS[@]} - 1)); then
146 words_[$j]=${words_[j]}${COMP_WORDS[i]}
147 if [ $i = $COMP_CWORD ]; then
153 if ! type _get_comp_words_by_ref >/dev/null 2>&1; then
154 _get_comp_words_by_ref ()
156 local exclude cur_ words_ cword_
157 if [ "$1" = "-n" ]; then
161 __git_reassemble_comp_words_by_ref "$exclude"
162 cur_=${words_[cword_]}
163 while [ $# -gt 0 ]; do
169 prev=${words_[$cword_-1]}
172 words=("${words_[@]}")
187 if [[ "$x" == "$3"* ]]; then
188 COMPREPLY[i++]="$2$x$4"
193 # Generates completion reply, appending a space to possible completion words,
195 # It accepts 1 to 4 arguments:
196 # 1: List of possible completion words.
197 # 2: A prefix to be added to each possible completion word (optional).
198 # 3: Generate possible completion matches for this word (optional).
199 # 4: A suffix to be appended to each possible completion word (optional).
202 local cur_="${3-$cur}"
208 local c i=0 IFS=$' \t\n'
211 if [[ $c == "$cur_"* ]]; then
216 COMPREPLY[i++]="${2-}$c"
223 # Generates completion reply from newline-separated possible completion words
224 # by appending a space to all of them.
225 # It accepts 1 to 4 arguments:
226 # 1: List of possible completion words, separated by a single newline.
227 # 2: A prefix to be added to each possible completion word (optional).
228 # 3: Generate possible completion matches for this word (optional).
229 # 4: A suffix to be appended to each possible completion word instead of
230 # the default space (optional). If specified but empty, nothing is
235 __gitcompadd "$1" "${2-}" "${3-$cur}" "${4- }"
238 # Generates completion reply with compgen from newline-separated possible
239 # completion filenames.
240 # It accepts 1 to 3 arguments:
241 # 1: List of possible completion filenames, separated by a single newline.
242 # 2: A directory prefix to be added to each possible completion filename
244 # 3: Generate possible completion matches for this word (optional).
249 # XXX does not work when the directory prefix contains a tilde,
250 # since tilde expansion is not applied.
251 # This means that COMPREPLY will be empty and Bash default
252 # completion will be used.
253 __gitcompadd "$1" "${2-}" "${3-$cur}" ""
255 # use a hack to enable file mode in bash < 4
256 compopt -o filenames +o nospace 2>/dev/null ||
257 compgen -f /non-existing-dir/ > /dev/null
260 # Execute 'git ls-files', unless the --committable option is specified, in
261 # which case it runs 'git diff-index' to find out the files that can be
262 # committed. It return paths relative to the directory specified in the first
263 # argument, and using the options specified in the second argument.
264 __git_ls_files_helper ()
267 test -n "${CDPATH+set}" && unset CDPATH
269 if [ "$2" == "--committable" ]; then
270 git diff-index --name-only --relative HEAD
272 # NOTE: $2 is not quoted in order to support multiple options
273 git ls-files --exclude-standard $2
279 # __git_index_files accepts 1 or 2 arguments:
280 # 1: Options to pass to ls-files (required).
281 # 2: A directory path (optional).
282 # If provided, only files within the specified directory are listed.
283 # Sub directories are never recursed. Path must have a trailing
287 local dir="$(__gitdir)" root="${2-.}" file
289 if [ -d "$dir" ]; then
290 __git_ls_files_helper "$root" "$1" |
291 while read -r file; do
293 ?*/*) echo "${file%%/*}" ;;
302 local dir="$(__gitdir)"
303 if [ -d "$dir" ]; then
304 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
312 local dir="$(__gitdir)"
313 if [ -d "$dir" ]; then
314 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
320 # __git_refs accepts 0, 1 (to pass to __gitdir), or 2 arguments
321 # presence of 2nd argument means use the guess heuristic employed
322 # by checkout for tracking branches
325 local i hash dir="$(__gitdir "${1-}")" track="${2-}"
327 if [ -d "$dir" ]; then
335 for i in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD; do
336 if [ -e "$dir/$i" ]; then echo $i; fi
338 format="refname:short"
339 refs="refs/tags refs/heads refs/remotes"
342 git --git-dir="$dir" for-each-ref --format="%($format)" \
344 if [ -n "$track" ]; then
345 # employ the heuristic used by git checkout
346 # Try to find a remote branch that matches the completion word
347 # but only output if the branch name is unique
349 git --git-dir="$dir" for-each-ref --shell --format="ref=%(refname:short)" \
351 while read -r entry; do
354 if [[ "$ref" == "$cur"* ]]; then
357 done | sort | uniq -u
363 git ls-remote "$dir" "$cur*" 2>/dev/null | \
364 while read -r hash i; do
373 git for-each-ref --format="%(refname:short)" -- "refs/remotes/$dir/" | sed -e "s#^$dir/##"
378 # __git_refs2 requires 1 argument (to pass to __git_refs)
382 for i in $(__git_refs "$1"); do
387 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
388 __git_refs_remotes ()
391 git ls-remote "$1" 'refs/heads/*' 2>/dev/null | \
392 while read -r hash i; do
393 echo "$i:refs/remotes/$1/${i#refs/heads/}"
399 local i IFS=$'\n' d="$(__gitdir)"
400 test -d "$d/remotes" && ls -1 "$d/remotes"
401 for i in $(git --git-dir="$d" config --get-regexp 'remote\..*\.url' 2>/dev/null); do
407 __git_list_merge_strategies ()
409 git merge -s help 2>&1 |
410 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
419 __git_merge_strategies=
420 # 'git merge -s help' (and thus detection of the merge strategy
421 # list) fails, unfortunately, if run outside of any git working
422 # tree. __git_merge_strategies is set to the empty string in
423 # that case, and the detection will be repeated the next time it
425 __git_compute_merge_strategies ()
427 test -n "$__git_merge_strategies" ||
428 __git_merge_strategies=$(__git_list_merge_strategies)
431 __git_complete_revlist_file ()
433 local pfx ls ref cur_="$cur"
453 case "$COMP_WORDBREAKS" in
455 *) pfx="$ref:$pfx" ;;
458 __gitcomp_nl "$(git --git-dir="$(__gitdir)" ls-tree "$ls" 2>/dev/null \
459 | sed '/^100... blob /{
475 pfx="${cur_%...*}..."
477 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
482 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
485 __gitcomp_nl "$(__git_refs)"
491 # __git_complete_index_file requires 1 argument:
492 # 1: the options to pass to ls-file
494 # The exception is --committable, which finds the files appropriate commit.
495 __git_complete_index_file ()
497 local pfx="" cur_="$cur"
507 __gitcomp_file "$(__git_index_files "$1" "$pfx")" "$pfx" "$cur_"
510 __git_complete_file ()
512 __git_complete_revlist_file
515 __git_complete_revlist ()
517 __git_complete_revlist_file
520 __git_complete_remote_or_refspec ()
522 local cur_="$cur" cmd="${words[1]}"
523 local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0
524 if [ "$cmd" = "remote" ]; then
527 while [ $c -lt $cword ]; do
530 --mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
533 push) no_complete_refspec=1 ;;
541 *) remote="$i"; break ;;
545 if [ -z "$remote" ]; then
546 __gitcomp_nl "$(__git_remotes)"
549 if [ $no_complete_refspec = 1 ]; then
552 [ "$remote" = "." ] && remote=
555 case "$COMP_WORDBREAKS" in
557 *) pfx="${cur_%%:*}:" ;;
569 if [ $lhs = 1 ]; then
570 __gitcomp_nl "$(__git_refs2 "$remote")" "$pfx" "$cur_"
572 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
576 if [ $lhs = 1 ]; then
577 __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
579 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
583 if [ $lhs = 1 ]; then
584 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
586 __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
592 __git_complete_strategy ()
594 __git_compute_merge_strategies
597 __gitcomp "$__git_merge_strategies"
602 __gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}"
610 if test -n "${GIT_TESTING_COMMAND_COMPLETION:-}"
612 printf "%s" "${GIT_TESTING_COMMAND_COMPLETION}"
614 git help -a|egrep '^ [a-zA-Z0-9]'
618 __git_list_all_commands ()
621 for i in $(__git_commands)
624 *--*) : helper pattern;;
631 __git_compute_all_commands ()
633 test -n "$__git_all_commands" ||
634 __git_all_commands=$(__git_list_all_commands)
637 __git_list_porcelain_commands ()
640 __git_compute_all_commands
641 for i in $__git_all_commands
644 *--*) : helper pattern;;
645 applymbox) : ask gittus;;
646 applypatch) : ask gittus;;
647 archimport) : import;;
648 cat-file) : plumbing;;
649 check-attr) : plumbing;;
650 check-ignore) : plumbing;;
651 check-ref-format) : plumbing;;
652 checkout-index) : plumbing;;
653 commit-tree) : plumbing;;
654 count-objects) : infrequent;;
655 credential-cache) : credentials helper;;
656 credential-store) : credentials helper;;
657 cvsexportcommit) : export;;
658 cvsimport) : import;;
659 cvsserver) : daemon;;
661 diff-files) : plumbing;;
662 diff-index) : plumbing;;
663 diff-tree) : plumbing;;
664 fast-import) : import;;
665 fast-export) : export;;
666 fsck-objects) : plumbing;;
667 fetch-pack) : plumbing;;
668 fmt-merge-msg) : plumbing;;
669 for-each-ref) : plumbing;;
670 hash-object) : plumbing;;
671 http-*) : transport;;
672 index-pack) : plumbing;;
673 init-db) : deprecated;;
674 local-fetch) : plumbing;;
675 lost-found) : infrequent;;
676 ls-files) : plumbing;;
677 ls-remote) : plumbing;;
678 ls-tree) : plumbing;;
679 mailinfo) : plumbing;;
680 mailsplit) : plumbing;;
681 merge-*) : plumbing;;
684 pack-objects) : plumbing;;
685 pack-redundant) : plumbing;;
686 pack-refs) : plumbing;;
687 parse-remote) : plumbing;;
688 patch-id) : plumbing;;
689 peek-remote) : plumbing;;
691 prune-packed) : plumbing;;
692 quiltimport) : import;;
693 read-tree) : plumbing;;
694 receive-pack) : plumbing;;
695 remote-*) : transport;;
696 repo-config) : deprecated;;
698 rev-list) : plumbing;;
699 rev-parse) : plumbing;;
700 runstatus) : plumbing;;
701 sh-setup) : internal;;
703 show-ref) : plumbing;;
704 send-pack) : plumbing;;
705 show-index) : plumbing;;
707 stripspace) : plumbing;;
708 symbolic-ref) : plumbing;;
709 tar-tree) : deprecated;;
710 unpack-file) : plumbing;;
711 unpack-objects) : plumbing;;
712 update-index) : plumbing;;
713 update-ref) : plumbing;;
714 update-server-info) : daemon;;
715 upload-archive) : plumbing;;
716 upload-pack) : plumbing;;
717 write-tree) : plumbing;;
719 verify-pack) : infrequent;;
720 verify-tag) : plumbing;;
726 __git_porcelain_commands=
727 __git_compute_porcelain_commands ()
729 __git_compute_all_commands
730 test -n "$__git_porcelain_commands" ||
731 __git_porcelain_commands=$(__git_list_porcelain_commands)
734 __git_pretty_aliases ()
737 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "pretty\..*" 2>/dev/null); do
750 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "alias\..*" 2>/dev/null); do
760 # __git_aliased_command requires 1 argument
761 __git_aliased_command ()
763 local word cmdline=$(git --git-dir="$(__gitdir)" \
764 config --get "alias.$1")
765 for word in $cmdline; do
771 \!*) : shell command alias ;;
773 *=*) : setting env ;;
782 # __git_find_on_cmdline requires 1 argument
783 __git_find_on_cmdline ()
785 local word subcommand c=1
786 while [ $c -lt $cword ]; do
788 for subcommand in $1; do
789 if [ "$subcommand" = "$word" ]; then
798 __git_has_doubledash ()
801 while [ $c -lt $cword ]; do
802 if [ "--" = "${words[c]}" ]; then
810 # Try to count non option arguments passed on the command line for the
811 # specified git command.
812 # When options are used, it is necessary to use the special -- option to
813 # tell the implementation were non option arguments begin.
814 # XXX this can not be improved, since options can appear everywhere, as
818 # __git_count_arguments requires 1 argument: the git command executed.
819 __git_count_arguments ()
823 # Skip "git" (first argument)
824 for ((i=1; i < ${#words[@]}; i++)); do
829 # Good; we can assume that the following are only non
834 # Skip the specified git command and discard git
847 __git_whitespacelist="nowarn warn error error-all fix"
851 local dir="$(__gitdir)"
852 if [ -d "$dir"/rebase-apply ]; then
853 __gitcomp "--skip --continue --resolved --abort"
858 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
863 --3way --committer-date-is-author-date --ignore-date
864 --ignore-whitespace --ignore-space-change
865 --interactive --keep --no-utf8 --signoff --utf8
866 --whitespace= --scissors
876 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
881 --stat --numstat --summary --check --index
882 --cached --index-info --reverse --reject --unidiff-zero
883 --apply --no-add --exclude=
884 --ignore-whitespace --ignore-space-change
885 --whitespace= --inaccurate-eof --verbose
896 --interactive --refresh --patch --update --dry-run
897 --ignore-errors --intent-to-add
902 # XXX should we check for --update and --all options ?
903 __git_complete_index_file "--others --modified"
910 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
914 __gitcomp_nl "$(__git_remotes)" "" "${cur##--remote=}"
919 --format= --list --verbose
920 --prefix= --remote= --exec=
930 __git_has_doubledash && return
932 local subcommands="start bad good skip reset visualize replay log run"
933 local subcommand="$(__git_find_on_cmdline "$subcommands")"
934 if [ -z "$subcommand" ]; then
935 if [ -f "$(__gitdir)"/BISECT_START ]; then
936 __gitcomp "$subcommands"
938 __gitcomp "replay start"
943 case "$subcommand" in
944 bad|good|reset|skip|start)
945 __gitcomp_nl "$(__git_refs)"
954 local i c=1 only_local_ref="n" has_r="n"
956 while [ $c -lt $cword ]; do
959 -d|-m) only_local_ref="y" ;;
967 __gitcomp "$(__git_refs)" "" "${cur##--set-upstream-to=}"
971 --color --no-color --verbose --abbrev= --no-abbrev
972 --track --no-track --contains --merged --no-merged
973 --set-upstream-to= --edit-description --list
978 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
979 __gitcomp_nl "$(__git_heads)"
981 __gitcomp_nl "$(__git_refs)"
989 local cmd="${words[2]}"
992 __gitcomp "create list-heads verify unbundle"
1000 __git_complete_revlist
1009 __git_has_doubledash && return
1013 __gitcomp "diff3 merge" "" "${cur##--conflict=}"
1017 --quiet --ours --theirs --track --no-track --merge
1018 --conflict= --orphan --patch
1022 # check if --track, --no-track, or --no-guess was specified
1023 # if so, disable DWIM mode
1024 local flags="--track --no-track --no-guess" track=1
1025 if [ -n "$(__git_find_on_cmdline "$flags")" ]; then
1028 __gitcomp_nl "$(__git_refs '' $track)"
1035 __gitcomp "$(__git_refs)"
1040 local dir="$(__gitdir)"
1041 if [ -f "$dir"/CHERRY_PICK_HEAD ]; then
1042 __gitcomp "--continue --quit --abort"
1047 __gitcomp "--edit --no-commit --signoff --strategy= --mainline"
1050 __gitcomp_nl "$(__git_refs)"
1059 __gitcomp "--dry-run --quiet"
1064 # XXX should we check for -x option ?
1065 __git_complete_index_file "--others"
1097 __gitcomp_nl "$(__git_refs)" "" "${cur}"
1104 __gitcomp "default strip verbatim whitespace
1105 " "" "${cur##--cleanup=}"
1108 --reuse-message=*|--reedit-message=*|\
1109 --fixup=*|--squash=*)
1110 __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1113 --untracked-files=*)
1114 __gitcomp "all no normal" "" "${cur##--untracked-files=}"
1119 --all --author= --signoff --verify --no-verify
1121 --amend --include --only --interactive
1122 --dry-run --reuse-message= --reedit-message=
1123 --reset-author --file= --message= --template=
1124 --cleanup= --untracked-files --untracked-files=
1125 --verbose --quiet --fixup= --squash=
1130 if git rev-parse --verify --quiet HEAD >/dev/null; then
1131 __git_complete_index_file "--committable"
1133 # This is the first commit
1134 __git_complete_index_file "--cached"
1143 --all --tags --contains --abbrev= --candidates=
1144 --exact-match --debug --long --match --always
1148 __gitcomp_nl "$(__git_refs)"
1151 __git_diff_algorithms="myers minimal patience histogram"
1153 __git_diff_common_options="--stat --numstat --shortstat --summary
1154 --patch-with-stat --name-only --name-status --color
1155 --no-color --color-words --no-renames --check
1156 --full-index --binary --abbrev --diff-filter=
1157 --find-copies-harder
1158 --text --ignore-space-at-eol --ignore-space-change
1159 --ignore-all-space --exit-code --quiet --ext-diff
1161 --no-prefix --src-prefix= --dst-prefix=
1162 --inter-hunk-context=
1163 --patience --histogram --minimal
1165 --dirstat --dirstat= --dirstat-by-file
1166 --dirstat-by-file= --cumulative
1172 __git_has_doubledash && return
1176 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
1180 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1181 --base --ours --theirs --no-index
1182 $__git_diff_common_options
1187 __git_complete_revlist_file
1190 __git_mergetools_common="diffuse ecmerge emerge kdiff3 meld opendiff
1191 tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc3 codecompare
1196 __git_has_doubledash && return
1200 __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
1204 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1205 --base --ours --theirs
1206 --no-renames --diff-filter= --find-copies-harder
1207 --relative --ignore-submodules
1212 __git_complete_revlist_file
1215 __git_fetch_options="
1216 --quiet --verbose --append --upload-pack --force --keep --depth=
1217 --tags --no-tags --all --prune --dry-run
1224 __gitcomp "$__git_fetch_options"
1228 __git_complete_remote_or_refspec
1231 __git_format_patch_options="
1232 --stdout --attach --no-attach --thread --thread= --no-thread
1233 --numbered --start-number --numbered-files --keep-subject --signoff
1234 --signature --no-signature --in-reply-to= --cc= --full-index --binary
1235 --not --all --cover-letter --no-prefix --src-prefix= --dst-prefix=
1236 --inline --suffix= --ignore-if-in-upstream --subject-prefix=
1237 --output-directory --reroll-count --to= --quiet --notes
1240 _git_format_patch ()
1246 " "" "${cur##--thread=}"
1250 __gitcomp "$__git_format_patch_options"
1254 __git_complete_revlist
1262 --tags --root --unreachable --cache --no-reflogs --full
1263 --strict --verbose --lost-found
1274 __gitcomp "--prune --aggressive"
1285 __git_match_ctag() {
1286 awk "/^${1////\\/}/ { print \$1 }" "$2"
1291 __git_has_doubledash && return
1297 --text --ignore-case --word-regexp --invert-match
1298 --full-name --line-number
1299 --extended-regexp --basic-regexp --fixed-strings
1301 --files-with-matches --name-only
1302 --files-without-match
1305 --and --or --not --all-match
1311 case "$cword,$prev" in
1313 if test -r tags; then
1314 __gitcomp_nl "$(__git_match_ctag "$cur" tags)"
1320 __gitcomp_nl "$(__git_refs)"
1327 __gitcomp "--all --info --man --web"
1331 __git_compute_all_commands
1332 __gitcomp "$__git_all_commands $(__git_aliases)
1333 attributes cli core-tutorial cvs-migration
1334 diffcore gitk glossary hooks ignore modules
1335 namespaces repository-layout tutorial tutorial-2
1345 false true umask group all world everybody
1346 " "" "${cur##--shared=}"
1350 __gitcomp "--quiet --bare --template= --shared --shared="
1360 __gitcomp "--cached --deleted --modified --others --ignored
1361 --stage --directory --no-empty-directory --unmerged
1362 --killed --exclude= --exclude-from=
1363 --exclude-per-directory= --exclude-standard
1364 --error-unmatch --with-tree= --full-name
1365 --abbrev --ignored --exclude-per-directory
1371 # XXX ignore options like --modified and always suggest all cached
1373 __git_complete_index_file "--cached"
1378 __gitcomp_nl "$(__git_remotes)"
1386 # Options that go well for log, shortlog and gitk
1387 __git_log_common_options="
1389 --branches --tags --remotes
1390 --first-parent --merges --no-merges
1392 --max-age= --since= --after=
1393 --min-age= --until= --before=
1394 --min-parents= --max-parents=
1395 --no-min-parents --no-max-parents
1397 # Options that go well for log and gitk (not shortlog)
1398 __git_log_gitk_options="
1399 --dense --sparse --full-history
1400 --simplify-merges --simplify-by-decoration
1401 --left-right --notes --no-notes
1403 # Options that go well for log and shortlog (not gitk)
1404 __git_log_shortlog_options="
1405 --author= --committer= --grep=
1409 __git_log_pretty_formats="oneline short medium full fuller email raw format:"
1410 __git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1414 __git_has_doubledash && return
1416 local g="$(git rev-parse --git-dir 2>/dev/null)"
1418 if [ -f "$g/MERGE_HEAD" ]; then
1422 --pretty=*|--format=*)
1423 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
1428 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1432 __gitcomp "long short" "" "${cur##--decorate=}"
1437 $__git_log_common_options
1438 $__git_log_shortlog_options
1439 $__git_log_gitk_options
1440 --root --topo-order --date-order --reverse
1441 --follow --full-diff
1442 --abbrev-commit --abbrev=
1443 --relative-date --date=
1444 --pretty= --format= --oneline
1447 --decorate --decorate=
1449 --parents --children
1451 $__git_diff_common_options
1452 --pickaxe-all --pickaxe-regex
1457 __git_complete_revlist
1460 __git_merge_options="
1461 --no-commit --no-stat --log --no-log --squash --strategy
1462 --commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit
1467 __git_complete_strategy && return
1471 __gitcomp "$__git_merge_options"
1474 __gitcomp_nl "$(__git_refs)"
1481 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1493 __gitcomp_nl "$(__git_refs)"
1500 __gitcomp "--dry-run"
1505 if [ $(__git_count_arguments "mv") -gt 0 ]; then
1506 # We need to show both cached and untracked files (including
1507 # empty directories) since this may not be the last argument.
1508 __git_complete_index_file "--cached --others --directory"
1510 __git_complete_index_file "--cached"
1516 __gitcomp "--tags --all --stdin"
1521 local subcommands='add append copy edit list prune remove show'
1522 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1524 case "$subcommand,$cur" in
1531 __gitcomp_nl "$(__git_refs)"
1534 __gitcomp "$subcommands --ref"
1538 add,--reuse-message=*|append,--reuse-message=*|\
1539 add,--reedit-message=*|append,--reedit-message=*)
1540 __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1543 __gitcomp '--file= --message= --reedit-message=
1550 __gitcomp '--dry-run --verbose'
1559 __gitcomp_nl "$(__git_refs)"
1568 __git_complete_strategy && return
1573 --rebase --no-rebase
1574 $__git_merge_options
1575 $__git_fetch_options
1580 __git_complete_remote_or_refspec
1587 __gitcomp_nl "$(__git_remotes)"
1592 __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}"
1597 --all --mirror --tags --dry-run --force --verbose
1598 --receive-pack= --repo= --set-upstream
1603 __git_complete_remote_or_refspec
1608 local dir="$(__gitdir)"
1609 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1610 __gitcomp "--continue --skip --abort"
1613 __git_complete_strategy && return
1616 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1621 --onto --merge --strategy --interactive
1622 --preserve-merges --stat --no-stat
1623 --committer-date-is-author-date --ignore-date
1624 --ignore-whitespace --whitespace=
1630 __gitcomp_nl "$(__git_refs)"
1635 local subcommands="show delete expire"
1636 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1638 if [ -z "$subcommand" ]; then
1639 __gitcomp "$subcommands"
1641 __gitcomp_nl "$(__git_refs)"
1645 __git_send_email_confirm_options="always never auto cc compose"
1646 __git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
1653 $__git_send_email_confirm_options
1654 " "" "${cur##--confirm=}"
1659 $__git_send_email_suppresscc_options
1660 " "" "${cur##--suppress-cc=}"
1664 --smtp-encryption=*)
1665 __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1671 " "" "${cur##--thread=}"
1675 __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1676 --compose --confirm= --dry-run --envelope-sender
1678 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1679 --no-suppress-from --no-thread --quiet
1680 --signed-off-by-cc --smtp-pass --smtp-server
1681 --smtp-server-port --smtp-encryption= --smtp-user
1682 --subject --suppress-cc= --suppress-from --thread --to
1683 --validate --no-validate
1684 $__git_format_patch_options"
1688 __git_complete_revlist
1696 __git_config_get_set_variables ()
1698 local prevword word config_file= c=$cword
1699 while [ $c -gt 1 ]; do
1702 --system|--global|--local|--file=*)
1707 config_file="$word $prevword"
1715 git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null |
1729 branch.*.remote|branch.*.pushremote)
1730 __gitcomp_nl "$(__git_remotes)"
1734 __gitcomp_nl "$(__git_refs)"
1738 __gitcomp "false true"
1742 __gitcomp_nl "$(__git_remotes)"
1746 local remote="${prev#remote.}"
1747 remote="${remote%.fetch}"
1748 if [ -z "$cur" ]; then
1749 __gitcomp_nl "refs/heads/" "" "" ""
1752 __gitcomp_nl "$(__git_refs_remotes "$remote")"
1756 local remote="${prev#remote.}"
1757 remote="${remote%.push}"
1758 __gitcomp_nl "$(git --git-dir="$(__gitdir)" \
1759 for-each-ref --format='%(refname):%(refname)' \
1763 pull.twohead|pull.octopus)
1764 __git_compute_merge_strategies
1765 __gitcomp "$__git_merge_strategies"
1768 color.branch|color.diff|color.interactive|\
1769 color.showbranch|color.status|color.ui)
1770 __gitcomp "always never auto"
1774 __gitcomp "false true"
1779 normal black red green yellow blue magenta cyan white
1780 bold dim ul blink reverse
1785 __gitcomp "log short"
1789 __gitcomp "man info web html"
1793 __gitcomp "$__git_log_date_formats"
1796 sendemail.aliasesfiletype)
1797 __gitcomp "mutt mailrc pine elm gnus"
1801 __gitcomp "$__git_send_email_confirm_options"
1804 sendemail.suppresscc)
1805 __gitcomp "$__git_send_email_suppresscc_options"
1808 --get|--get-all|--unset|--unset-all)
1809 __gitcomp_nl "$(__git_config_get_set_variables)"
1819 --system --global --local --file=
1820 --list --replace-all
1821 --get --get-all --get-regexp
1822 --add --unset --unset-all
1823 --remove-section --rename-section
1828 local pfx="${cur%.*}." cur_="${cur##*.}"
1829 __gitcomp "remote pushremote merge mergeoptions rebase" "$pfx" "$cur_"
1833 local pfx="${cur%.*}." cur_="${cur#*.}"
1834 __gitcomp_nl "$(__git_heads)" "$pfx" "$cur_" "."
1838 local pfx="${cur%.*}." cur_="${cur##*.}"
1840 argprompt cmd confirm needsfile noconsole norescan
1841 prompt revprompt revunmerged title
1846 local pfx="${cur%.*}." cur_="${cur##*.}"
1847 __gitcomp "cmd path" "$pfx" "$cur_"
1851 local pfx="${cur%.*}." cur_="${cur##*.}"
1852 __gitcomp "cmd path" "$pfx" "$cur_"
1856 local pfx="${cur%.*}." cur_="${cur##*.}"
1857 __gitcomp "cmd path trustExitCode" "$pfx" "$cur_"
1861 local pfx="${cur%.*}." cur_="${cur#*.}"
1862 __git_compute_all_commands
1863 __gitcomp_nl "$__git_all_commands" "$pfx" "$cur_"
1867 local pfx="${cur%.*}." cur_="${cur##*.}"
1869 url proxy fetch push mirror skipDefaultUpdate
1870 receivepack uploadpack tagopt pushurl
1875 local pfx="${cur%.*}." cur_="${cur#*.}"
1876 __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
1880 local pfx="${cur%.*}." cur_="${cur##*.}"
1881 __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_"
1887 advice.commitBeforeMerge
1889 advice.implicitIdentity
1890 advice.pushNonFastForward
1891 advice.resolveConflict
1895 apply.ignorewhitespace
1897 branch.autosetupmerge
1898 branch.autosetuprebase
1902 color.branch.current
1907 color.decorate.branch
1908 color.decorate.remoteBranch
1909 color.decorate.stash
1919 color.diff.whitespace
1924 color.grep.linenumber
1927 color.grep.separator
1929 color.interactive.error
1930 color.interactive.header
1931 color.interactive.help
1932 color.interactive.prompt
1937 color.status.changed
1939 color.status.nobranch
1940 color.status.untracked
1941 color.status.updated
1950 core.bigFileThreshold
1953 core.deltaBaseCacheLimit
1958 core.fsyncobjectfiles
1960 core.ignoreCygwinFSTricks
1963 core.logAllRefUpdates
1964 core.loosecompression
1967 core.packedGitWindowSize
1969 core.preferSymlinkRefs
1972 core.repositoryFormatVersion
1974 core.sharedRepository
1978 core.warnAmbiguousRefs
1981 diff.autorefreshindex
1983 diff.ignoreSubmodules
1990 diff.suppressBlankEmpty
1996 fetch.recurseSubmodules
2005 format.subjectprefix
2016 gc.reflogexpireunreachable
2020 gitcvs.commitmsgannotation
2021 gitcvs.dbTableNamePrefix
2032 gui.copyblamethreshold
2036 gui.matchtrackingbranch
2037 gui.newbranchtemplate
2038 gui.pruneduringfetch
2039 gui.spellingdictionary
2054 http.sslCertPasswordProtected
2059 i18n.logOutputEncoding
2065 imap.preformattedHTML
2075 interactive.singlekey
2091 mergetool.keepBackup
2092 mergetool.keepTemporaries
2097 notes.rewrite.rebase
2101 pack.deltaCacheLimit
2117 receive.denyCurrentBranch
2118 receive.denyDeleteCurrent
2120 receive.denyNonFastForwards
2123 receive.updateserverinfo
2126 repack.usedeltabaseoffset
2130 sendemail.aliasesfile
2131 sendemail.aliasfiletype
2135 sendemail.chainreplyto
2137 sendemail.envelopesender
2141 sendemail.signedoffbycc
2142 sendemail.smtpdomain
2143 sendemail.smtpencryption
2145 sendemail.smtpserver
2146 sendemail.smtpserveroption
2147 sendemail.smtpserverport
2149 sendemail.suppresscc
2150 sendemail.suppressfrom
2155 status.relativePaths
2156 status.showUntrackedFiles
2157 status.submodulesummary
2160 transfer.unpackLimit
2172 local subcommands="add rename remove set-head set-branches set-url show prune update"
2173 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2174 if [ -z "$subcommand" ]; then
2175 __gitcomp "$subcommands"
2179 case "$subcommand" in
2180 rename|remove|set-url|show|prune)
2181 __gitcomp_nl "$(__git_remotes)"
2183 set-head|set-branches)
2184 __git_complete_remote_or_refspec
2187 local i c='' IFS=$'\n'
2188 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "remotes\..*" 2>/dev/null); do
2201 __gitcomp_nl "$(__git_refs)"
2206 __git_has_doubledash && return
2210 __gitcomp "--merge --mixed --hard --soft --patch"
2214 __gitcomp_nl "$(__git_refs)"
2221 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
2225 __gitcomp_nl "$(__git_refs)"
2232 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
2237 __git_complete_index_file "--cached"
2242 __git_has_doubledash && return
2247 $__git_log_common_options
2248 $__git_log_shortlog_options
2249 --numbered --summary
2254 __git_complete_revlist
2259 __git_has_doubledash && return
2262 --pretty=*|--format=*)
2263 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
2268 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
2272 __gitcomp "--pretty= --format= --abbrev-commit --oneline
2273 $__git_diff_common_options
2278 __git_complete_revlist_file
2286 --all --remotes --topo-order --current --more=
2287 --list --independent --merge-base --no-name
2289 --sha1-name --sparse --topics --reflog
2294 __git_complete_revlist
2299 local save_opts='--keep-index --no-keep-index --quiet --patch'
2300 local subcommands='save list show apply clear drop pop create branch'
2301 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2302 if [ -z "$subcommand" ]; then
2305 __gitcomp "$save_opts"
2308 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2309 __gitcomp "$subcommands"
2314 case "$subcommand,$cur" in
2316 __gitcomp "$save_opts"
2319 __gitcomp "--index --quiet"
2321 show,--*|drop,--*|branch,--*)
2323 show,*|apply,*|drop,*|pop,*|branch,*)
2324 __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
2325 | sed -n -e 's/:.*//p')"
2335 __git_has_doubledash && return
2337 local subcommands="add status init deinit update summary foreach sync"
2338 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2341 __gitcomp "--quiet --cached"
2344 __gitcomp "$subcommands"
2354 init fetch clone rebase dcommit log find-rev
2355 set-tree commit-diff info create-ignore propget
2356 proplist show-ignore show-externals branch tag blame
2357 migrate mkdirs reset gc
2359 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2360 if [ -z "$subcommand" ]; then
2361 __gitcomp "$subcommands"
2363 local remote_opts="--username= --config-dir= --no-auth-cache"
2365 --follow-parent --authors-file= --repack=
2366 --no-metadata --use-svm-props --use-svnsync-props
2367 --log-window-size= --no-checkout --quiet
2368 --repack-flags --use-log-author --localtime
2369 --ignore-paths= --include-paths= $remote_opts
2372 --template= --shared= --trunk= --tags=
2373 --branches= --stdlayout --minimize-url
2374 --no-metadata --use-svm-props --use-svnsync-props
2375 --rewrite-root= --prefix= --use-log-author
2376 --add-author-from $remote_opts
2379 --edit --rmdir --find-copies-harder --copy-similarity=
2382 case "$subcommand,$cur" in
2384 __gitcomp "--revision= --fetch-all $fc_opts"
2387 __gitcomp "--revision= $fc_opts $init_opts"
2390 __gitcomp "$init_opts"
2394 --merge --strategy= --verbose --dry-run
2395 --fetch-all --no-rebase --commit-url
2396 --revision --interactive $cmt_opts $fc_opts
2400 __gitcomp "--stdin $cmt_opts $fc_opts"
2402 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
2403 show-externals,--*|mkdirs,--*)
2404 __gitcomp "--revision="
2408 --limit= --revision= --verbose --incremental
2409 --oneline --show-commit --non-recursive
2410 --authors-file= --color
2415 --merge --verbose --strategy= --local
2416 --fetch-all --dry-run $fc_opts
2420 __gitcomp "--message= --file= --revision= $cmt_opts"
2426 __gitcomp "--dry-run --message --tag"
2429 __gitcomp "--dry-run --message"
2432 __gitcomp "--git-format"
2436 --config-dir= --ignore-paths= --minimize
2437 --no-auth-cache --username=
2441 __gitcomp "--revision= --parent"
2452 while [ $c -lt $cword ]; do
2456 __gitcomp_nl "$(__git_tags)"
2471 __gitcomp_nl "$(__git_tags)"
2475 __gitcomp_nl "$(__git_refs)"
2487 local i c=1 command __git_dir
2489 while [ $c -lt $cword ]; do
2492 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2493 --bare) __git_dir="." ;;
2494 --help) command="help"; break ;;
2497 *) command="$i"; break ;;
2502 if [ -z "$command" ]; then
2516 --no-replace-objects
2520 *) __git_compute_porcelain_commands
2521 __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
2526 local completion_func="_git_${command//-/_}"
2527 declare -f $completion_func >/dev/null && $completion_func && return
2529 local expansion=$(__git_aliased_command "$command")
2530 if [ -n "$expansion" ]; then
2531 completion_func="_git_${expansion//-/_}"
2532 declare -f $completion_func >/dev/null && $completion_func
2538 __git_has_doubledash && return
2540 local g="$(__gitdir)"
2542 if [ -f "$g/MERGE_HEAD" ]; then
2548 $__git_log_common_options
2549 $__git_log_gitk_options
2555 __git_complete_revlist
2558 if [[ -n ${ZSH_VERSION-} ]]; then
2559 echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
2561 autoload -U +X compinit && compinit
2567 local cur_="${3-$cur}"
2573 local c IFS=$' \t\n'
2584 compadd -Q -S '' -p "${2-}" -a -- array && _ret=0
2595 compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0
2604 compadd -Q -p "${2-}" -f -- ${=1} && _ret=0
2609 local _ret=1 cur cword prev
2610 cur=${words[CURRENT]}
2611 prev=${words[CURRENT-1]}
2613 emulate ksh -c __${service}_main
2614 let _ret && _default && _ret=0
2618 compdef _git git gitk
2624 local cur words cword prev
2625 _get_comp_words_by_ref -n =: cur words cword prev
2629 # Setup completion for certain functions defined above by setting common
2630 # variables and workarounds.
2631 # This is NOT a public function; use at your own risk.
2634 local wrapper="__git_wrap${2}"
2635 eval "$wrapper () { __git_func_wrap $2 ; }"
2636 complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \
2637 || complete -o default -o nospace -F $wrapper $1
2640 # wrapper for backwards compatibility
2643 __git_wrap__git_main
2646 # wrapper for backwards compatibility
2649 __git_wrap__gitk_main
2652 __git_complete git __git_main
2653 __git_complete gitk __gitk_main
2655 # The following are necessary only for Cygwin, and only are needed
2656 # when the user has tab-completed the executable name and consequently
2657 # included the '.exe' suffix.
2659 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
2660 __git_complete git.exe __git_main