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-mailmap) : plumbing;;
652 check-ref-format) : plumbing;;
653 checkout-index) : plumbing;;
654 commit-tree) : plumbing;;
655 count-objects) : infrequent;;
656 credential-cache) : credentials helper;;
657 credential-store) : credentials helper;;
658 cvsexportcommit) : export;;
659 cvsimport) : import;;
660 cvsserver) : daemon;;
662 diff-files) : plumbing;;
663 diff-index) : plumbing;;
664 diff-tree) : plumbing;;
665 fast-import) : import;;
666 fast-export) : export;;
667 fsck-objects) : plumbing;;
668 fetch-pack) : plumbing;;
669 fmt-merge-msg) : plumbing;;
670 for-each-ref) : plumbing;;
671 hash-object) : plumbing;;
672 http-*) : transport;;
673 index-pack) : plumbing;;
674 init-db) : deprecated;;
675 local-fetch) : plumbing;;
676 lost-found) : infrequent;;
677 ls-files) : plumbing;;
678 ls-remote) : plumbing;;
679 ls-tree) : plumbing;;
680 mailinfo) : plumbing;;
681 mailsplit) : plumbing;;
682 merge-*) : plumbing;;
685 pack-objects) : plumbing;;
686 pack-redundant) : plumbing;;
687 pack-refs) : plumbing;;
688 parse-remote) : plumbing;;
689 patch-id) : plumbing;;
690 peek-remote) : plumbing;;
692 prune-packed) : plumbing;;
693 quiltimport) : import;;
694 read-tree) : plumbing;;
695 receive-pack) : plumbing;;
696 remote-*) : transport;;
697 repo-config) : deprecated;;
699 rev-list) : plumbing;;
700 rev-parse) : plumbing;;
701 runstatus) : plumbing;;
702 sh-setup) : internal;;
704 show-ref) : plumbing;;
705 send-pack) : plumbing;;
706 show-index) : plumbing;;
708 stripspace) : plumbing;;
709 symbolic-ref) : plumbing;;
710 tar-tree) : deprecated;;
711 unpack-file) : plumbing;;
712 unpack-objects) : plumbing;;
713 update-index) : plumbing;;
714 update-ref) : plumbing;;
715 update-server-info) : daemon;;
716 upload-archive) : plumbing;;
717 upload-pack) : plumbing;;
718 write-tree) : plumbing;;
720 verify-pack) : infrequent;;
721 verify-tag) : plumbing;;
727 __git_porcelain_commands=
728 __git_compute_porcelain_commands ()
730 __git_compute_all_commands
731 test -n "$__git_porcelain_commands" ||
732 __git_porcelain_commands=$(__git_list_porcelain_commands)
735 __git_pretty_aliases ()
738 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "pretty\..*" 2>/dev/null); do
751 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "alias\..*" 2>/dev/null); do
761 # __git_aliased_command requires 1 argument
762 __git_aliased_command ()
764 local word cmdline=$(git --git-dir="$(__gitdir)" \
765 config --get "alias.$1")
766 for word in $cmdline; do
772 \!*) : shell command alias ;;
774 *=*) : setting env ;;
783 # __git_find_on_cmdline requires 1 argument
784 __git_find_on_cmdline ()
786 local word subcommand c=1
787 while [ $c -lt $cword ]; do
789 for subcommand in $1; do
790 if [ "$subcommand" = "$word" ]; then
799 __git_has_doubledash ()
802 while [ $c -lt $cword ]; do
803 if [ "--" = "${words[c]}" ]; then
811 # Try to count non option arguments passed on the command line for the
812 # specified git command.
813 # When options are used, it is necessary to use the special -- option to
814 # tell the implementation were non option arguments begin.
815 # XXX this can not be improved, since options can appear everywhere, as
819 # __git_count_arguments requires 1 argument: the git command executed.
820 __git_count_arguments ()
824 # Skip "git" (first argument)
825 for ((i=1; i < ${#words[@]}; i++)); do
830 # Good; we can assume that the following are only non
835 # Skip the specified git command and discard git
848 __git_whitespacelist="nowarn warn error error-all fix"
852 local dir="$(__gitdir)"
853 if [ -d "$dir"/rebase-apply ]; then
854 __gitcomp "--skip --continue --resolved --abort"
859 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
864 --3way --committer-date-is-author-date --ignore-date
865 --ignore-whitespace --ignore-space-change
866 --interactive --keep --no-utf8 --signoff --utf8
867 --whitespace= --scissors
877 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
882 --stat --numstat --summary --check --index
883 --cached --index-info --reverse --reject --unidiff-zero
884 --apply --no-add --exclude=
885 --ignore-whitespace --ignore-space-change
886 --whitespace= --inaccurate-eof --verbose
897 --interactive --refresh --patch --update --dry-run
898 --ignore-errors --intent-to-add
903 # XXX should we check for --update and --all options ?
904 __git_complete_index_file "--others --modified --directory --no-empty-directory"
911 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
915 __gitcomp_nl "$(__git_remotes)" "" "${cur##--remote=}"
920 --format= --list --verbose
921 --prefix= --remote= --exec=
931 __git_has_doubledash && return
933 local subcommands="start bad good skip reset visualize replay log run"
934 local subcommand="$(__git_find_on_cmdline "$subcommands")"
935 if [ -z "$subcommand" ]; then
936 if [ -f "$(__gitdir)"/BISECT_START ]; then
937 __gitcomp "$subcommands"
939 __gitcomp "replay start"
944 case "$subcommand" in
945 bad|good|reset|skip|start)
946 __gitcomp_nl "$(__git_refs)"
955 local i c=1 only_local_ref="n" has_r="n"
957 while [ $c -lt $cword ]; do
960 -d|-m) only_local_ref="y" ;;
968 __gitcomp "$(__git_refs)" "" "${cur##--set-upstream-to=}"
972 --color --no-color --verbose --abbrev= --no-abbrev
973 --track --no-track --contains --merged --no-merged
974 --set-upstream-to= --edit-description --list
979 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
980 __gitcomp_nl "$(__git_heads)"
982 __gitcomp_nl "$(__git_refs)"
990 local cmd="${words[2]}"
993 __gitcomp "create list-heads verify unbundle"
1001 __git_complete_revlist
1010 __git_has_doubledash && return
1014 __gitcomp "diff3 merge" "" "${cur##--conflict=}"
1018 --quiet --ours --theirs --track --no-track --merge
1019 --conflict= --orphan --patch
1023 # check if --track, --no-track, or --no-guess was specified
1024 # if so, disable DWIM mode
1025 local flags="--track --no-track --no-guess" track=1
1026 if [ -n "$(__git_find_on_cmdline "$flags")" ]; then
1029 __gitcomp_nl "$(__git_refs '' $track)"
1036 __gitcomp "$(__git_refs)"
1041 local dir="$(__gitdir)"
1042 if [ -f "$dir"/CHERRY_PICK_HEAD ]; then
1043 __gitcomp "--continue --quit --abort"
1048 __gitcomp "--edit --no-commit --signoff --strategy= --mainline"
1051 __gitcomp_nl "$(__git_refs)"
1060 __gitcomp "--dry-run --quiet"
1065 # XXX should we check for -x option ?
1066 __git_complete_index_file "--others --directory"
1098 __gitcomp_nl "$(__git_refs)" "" "${cur}"
1105 __gitcomp "default strip verbatim whitespace
1106 " "" "${cur##--cleanup=}"
1109 --reuse-message=*|--reedit-message=*|\
1110 --fixup=*|--squash=*)
1111 __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1114 --untracked-files=*)
1115 __gitcomp "all no normal" "" "${cur##--untracked-files=}"
1120 --all --author= --signoff --verify --no-verify
1122 --amend --include --only --interactive
1123 --dry-run --reuse-message= --reedit-message=
1124 --reset-author --file= --message= --template=
1125 --cleanup= --untracked-files --untracked-files=
1126 --verbose --quiet --fixup= --squash=
1131 if git rev-parse --verify --quiet HEAD >/dev/null; then
1132 __git_complete_index_file "--committable"
1134 # This is the first commit
1135 __git_complete_index_file "--cached"
1144 --all --tags --contains --abbrev= --candidates=
1145 --exact-match --debug --long --match --always
1149 __gitcomp_nl "$(__git_refs)"
1152 __git_diff_algorithms="myers minimal patience histogram"
1154 __git_diff_common_options="--stat --numstat --shortstat --summary
1155 --patch-with-stat --name-only --name-status --color
1156 --no-color --color-words --no-renames --check
1157 --full-index --binary --abbrev --diff-filter=
1158 --find-copies-harder
1159 --text --ignore-space-at-eol --ignore-space-change
1160 --ignore-all-space --exit-code --quiet --ext-diff
1162 --no-prefix --src-prefix= --dst-prefix=
1163 --inter-hunk-context=
1164 --patience --histogram --minimal
1166 --dirstat --dirstat= --dirstat-by-file
1167 --dirstat-by-file= --cumulative
1173 __git_has_doubledash && return
1177 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
1181 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1182 --base --ours --theirs --no-index
1183 $__git_diff_common_options
1188 __git_complete_revlist_file
1191 __git_mergetools_common="diffuse ecmerge emerge kdiff3 meld opendiff
1192 tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc3 codecompare
1197 __git_has_doubledash && return
1201 __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
1205 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1206 --base --ours --theirs
1207 --no-renames --diff-filter= --find-copies-harder
1208 --relative --ignore-submodules
1213 __git_complete_revlist_file
1216 __git_fetch_options="
1217 --quiet --verbose --append --upload-pack --force --keep --depth=
1218 --tags --no-tags --all --prune --dry-run
1225 __gitcomp "$__git_fetch_options"
1229 __git_complete_remote_or_refspec
1232 __git_format_patch_options="
1233 --stdout --attach --no-attach --thread --thread= --no-thread
1234 --numbered --start-number --numbered-files --keep-subject --signoff
1235 --signature --no-signature --in-reply-to= --cc= --full-index --binary
1236 --not --all --cover-letter --no-prefix --src-prefix= --dst-prefix=
1237 --inline --suffix= --ignore-if-in-upstream --subject-prefix=
1238 --output-directory --reroll-count --to= --quiet --notes
1241 _git_format_patch ()
1247 " "" "${cur##--thread=}"
1251 __gitcomp "$__git_format_patch_options"
1255 __git_complete_revlist
1263 --tags --root --unreachable --cache --no-reflogs --full
1264 --strict --verbose --lost-found
1275 __gitcomp "--prune --aggressive"
1286 __git_match_ctag() {
1287 awk "/^${1////\\/}/ { print \$1 }" "$2"
1292 __git_has_doubledash && return
1298 --text --ignore-case --word-regexp --invert-match
1299 --full-name --line-number
1300 --extended-regexp --basic-regexp --fixed-strings
1302 --files-with-matches --name-only
1303 --files-without-match
1306 --and --or --not --all-match
1312 case "$cword,$prev" in
1314 if test -r tags; then
1315 __gitcomp_nl "$(__git_match_ctag "$cur" tags)"
1321 __gitcomp_nl "$(__git_refs)"
1328 __gitcomp "--all --info --man --web"
1332 __git_compute_all_commands
1333 __gitcomp "$__git_all_commands $(__git_aliases)
1334 attributes cli core-tutorial cvs-migration
1335 diffcore gitk glossary hooks ignore modules
1336 namespaces repository-layout tutorial tutorial-2
1346 false true umask group all world everybody
1347 " "" "${cur##--shared=}"
1351 __gitcomp "--quiet --bare --template= --shared --shared="
1361 __gitcomp "--cached --deleted --modified --others --ignored
1362 --stage --directory --no-empty-directory --unmerged
1363 --killed --exclude= --exclude-from=
1364 --exclude-per-directory= --exclude-standard
1365 --error-unmatch --with-tree= --full-name
1366 --abbrev --ignored --exclude-per-directory
1372 # XXX ignore options like --modified and always suggest all cached
1374 __git_complete_index_file "--cached"
1379 __gitcomp_nl "$(__git_remotes)"
1387 # Options that go well for log, shortlog and gitk
1388 __git_log_common_options="
1390 --branches --tags --remotes
1391 --first-parent --merges --no-merges
1393 --max-age= --since= --after=
1394 --min-age= --until= --before=
1395 --min-parents= --max-parents=
1396 --no-min-parents --no-max-parents
1398 # Options that go well for log and gitk (not shortlog)
1399 __git_log_gitk_options="
1400 --dense --sparse --full-history
1401 --simplify-merges --simplify-by-decoration
1402 --left-right --notes --no-notes
1404 # Options that go well for log and shortlog (not gitk)
1405 __git_log_shortlog_options="
1406 --author= --committer= --grep=
1410 __git_log_pretty_formats="oneline short medium full fuller email raw format:"
1411 __git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1415 __git_has_doubledash && return
1417 local g="$(git rev-parse --git-dir 2>/dev/null)"
1419 if [ -f "$g/MERGE_HEAD" ]; then
1423 --pretty=*|--format=*)
1424 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
1429 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1433 __gitcomp "long short" "" "${cur##--decorate=}"
1438 $__git_log_common_options
1439 $__git_log_shortlog_options
1440 $__git_log_gitk_options
1441 --root --topo-order --date-order --reverse
1442 --follow --full-diff
1443 --abbrev-commit --abbrev=
1444 --relative-date --date=
1445 --pretty= --format= --oneline
1448 --decorate --decorate=
1450 --parents --children
1452 $__git_diff_common_options
1453 --pickaxe-all --pickaxe-regex
1458 __git_complete_revlist
1461 __git_merge_options="
1462 --no-commit --no-stat --log --no-log --squash --strategy
1463 --commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit
1468 __git_complete_strategy && return
1472 __gitcomp "$__git_merge_options"
1475 __gitcomp_nl "$(__git_refs)"
1482 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1494 __gitcomp_nl "$(__git_refs)"
1501 __gitcomp "--dry-run"
1506 if [ $(__git_count_arguments "mv") -gt 0 ]; then
1507 # We need to show both cached and untracked files (including
1508 # empty directories) since this may not be the last argument.
1509 __git_complete_index_file "--cached --others --directory"
1511 __git_complete_index_file "--cached"
1517 __gitcomp "--tags --all --stdin"
1522 local subcommands='add append copy edit list prune remove show'
1523 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1525 case "$subcommand,$cur" in
1532 __gitcomp_nl "$(__git_refs)"
1535 __gitcomp "$subcommands --ref"
1539 add,--reuse-message=*|append,--reuse-message=*|\
1540 add,--reedit-message=*|append,--reedit-message=*)
1541 __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1544 __gitcomp '--file= --message= --reedit-message=
1551 __gitcomp '--dry-run --verbose'
1560 __gitcomp_nl "$(__git_refs)"
1569 __git_complete_strategy && return
1574 --rebase --no-rebase
1575 $__git_merge_options
1576 $__git_fetch_options
1581 __git_complete_remote_or_refspec
1588 __gitcomp_nl "$(__git_remotes)"
1593 __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}"
1598 --all --mirror --tags --dry-run --force --verbose
1599 --receive-pack= --repo= --set-upstream
1604 __git_complete_remote_or_refspec
1609 local dir="$(__gitdir)"
1610 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1611 __gitcomp "--continue --skip --abort"
1614 __git_complete_strategy && return
1617 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1622 --onto --merge --strategy --interactive
1623 --preserve-merges --stat --no-stat
1624 --committer-date-is-author-date --ignore-date
1625 --ignore-whitespace --whitespace=
1631 __gitcomp_nl "$(__git_refs)"
1636 local subcommands="show delete expire"
1637 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1639 if [ -z "$subcommand" ]; then
1640 __gitcomp "$subcommands"
1642 __gitcomp_nl "$(__git_refs)"
1646 __git_send_email_confirm_options="always never auto cc compose"
1647 __git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
1654 $__git_send_email_confirm_options
1655 " "" "${cur##--confirm=}"
1660 $__git_send_email_suppresscc_options
1661 " "" "${cur##--suppress-cc=}"
1665 --smtp-encryption=*)
1666 __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1672 " "" "${cur##--thread=}"
1676 __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1677 --compose --confirm= --dry-run --envelope-sender
1679 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1680 --no-suppress-from --no-thread --quiet
1681 --signed-off-by-cc --smtp-pass --smtp-server
1682 --smtp-server-port --smtp-encryption= --smtp-user
1683 --subject --suppress-cc= --suppress-from --thread --to
1684 --validate --no-validate
1685 $__git_format_patch_options"
1689 __git_complete_revlist
1697 __git_config_get_set_variables ()
1699 local prevword word config_file= c=$cword
1700 while [ $c -gt 1 ]; do
1703 --system|--global|--local|--file=*)
1708 config_file="$word $prevword"
1716 git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null |
1730 branch.*.remote|branch.*.pushremote)
1731 __gitcomp_nl "$(__git_remotes)"
1735 __gitcomp_nl "$(__git_refs)"
1739 __gitcomp "false true"
1743 __gitcomp_nl "$(__git_remotes)"
1747 local remote="${prev#remote.}"
1748 remote="${remote%.fetch}"
1749 if [ -z "$cur" ]; then
1750 __gitcomp_nl "refs/heads/" "" "" ""
1753 __gitcomp_nl "$(__git_refs_remotes "$remote")"
1757 local remote="${prev#remote.}"
1758 remote="${remote%.push}"
1759 __gitcomp_nl "$(git --git-dir="$(__gitdir)" \
1760 for-each-ref --format='%(refname):%(refname)' \
1764 pull.twohead|pull.octopus)
1765 __git_compute_merge_strategies
1766 __gitcomp "$__git_merge_strategies"
1769 color.branch|color.diff|color.interactive|\
1770 color.showbranch|color.status|color.ui)
1771 __gitcomp "always never auto"
1775 __gitcomp "false true"
1780 normal black red green yellow blue magenta cyan white
1781 bold dim ul blink reverse
1786 __gitcomp "log short"
1790 __gitcomp "man info web html"
1794 __gitcomp "$__git_log_date_formats"
1797 sendemail.aliasesfiletype)
1798 __gitcomp "mutt mailrc pine elm gnus"
1802 __gitcomp "$__git_send_email_confirm_options"
1805 sendemail.suppresscc)
1806 __gitcomp "$__git_send_email_suppresscc_options"
1809 --get|--get-all|--unset|--unset-all)
1810 __gitcomp_nl "$(__git_config_get_set_variables)"
1820 --system --global --local --file=
1821 --list --replace-all
1822 --get --get-all --get-regexp
1823 --add --unset --unset-all
1824 --remove-section --rename-section
1829 local pfx="${cur%.*}." cur_="${cur##*.}"
1830 __gitcomp "remote pushremote merge mergeoptions rebase" "$pfx" "$cur_"
1834 local pfx="${cur%.*}." cur_="${cur#*.}"
1835 __gitcomp_nl "$(__git_heads)" "$pfx" "$cur_" "."
1839 local pfx="${cur%.*}." cur_="${cur##*.}"
1841 argprompt cmd confirm needsfile noconsole norescan
1842 prompt revprompt revunmerged title
1847 local pfx="${cur%.*}." cur_="${cur##*.}"
1848 __gitcomp "cmd path" "$pfx" "$cur_"
1852 local pfx="${cur%.*}." cur_="${cur##*.}"
1853 __gitcomp "cmd path" "$pfx" "$cur_"
1857 local pfx="${cur%.*}." cur_="${cur##*.}"
1858 __gitcomp "cmd path trustExitCode" "$pfx" "$cur_"
1862 local pfx="${cur%.*}." cur_="${cur#*.}"
1863 __git_compute_all_commands
1864 __gitcomp_nl "$__git_all_commands" "$pfx" "$cur_"
1868 local pfx="${cur%.*}." cur_="${cur##*.}"
1870 url proxy fetch push mirror skipDefaultUpdate
1871 receivepack uploadpack tagopt pushurl
1876 local pfx="${cur%.*}." cur_="${cur#*.}"
1877 __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
1881 local pfx="${cur%.*}." cur_="${cur##*.}"
1882 __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_"
1888 advice.commitBeforeMerge
1890 advice.implicitIdentity
1891 advice.pushNonFastForward
1892 advice.resolveConflict
1896 apply.ignorewhitespace
1898 branch.autosetupmerge
1899 branch.autosetuprebase
1903 color.branch.current
1908 color.decorate.branch
1909 color.decorate.remoteBranch
1910 color.decorate.stash
1920 color.diff.whitespace
1925 color.grep.linenumber
1928 color.grep.separator
1930 color.interactive.error
1931 color.interactive.header
1932 color.interactive.help
1933 color.interactive.prompt
1938 color.status.changed
1940 color.status.nobranch
1941 color.status.untracked
1942 color.status.updated
1951 core.bigFileThreshold
1954 core.deltaBaseCacheLimit
1959 core.fsyncobjectfiles
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 --git-dir) ((c++)) ; __git_dir="${words[c]}" ;;
2494 --bare) __git_dir="." ;;
2495 --help) command="help"; break ;;
2496 -c|--work-tree|--namespace) ((c++)) ;;
2498 *) command="$i"; break ;;
2503 if [ -z "$command" ]; then
2518 --no-replace-objects
2522 *) __git_compute_porcelain_commands
2523 __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
2528 local completion_func="_git_${command//-/_}"
2529 declare -f $completion_func >/dev/null && $completion_func && return
2531 local expansion=$(__git_aliased_command "$command")
2532 if [ -n "$expansion" ]; then
2533 completion_func="_git_${expansion//-/_}"
2534 declare -f $completion_func >/dev/null && $completion_func
2540 __git_has_doubledash && return
2542 local g="$(__gitdir)"
2544 if [ -f "$g/MERGE_HEAD" ]; then
2550 $__git_log_common_options
2551 $__git_log_gitk_options
2557 __git_complete_revlist
2560 if [[ -n ${ZSH_VERSION-} ]]; then
2561 echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
2563 autoload -U +X compinit && compinit
2569 local cur_="${3-$cur}"
2575 local c IFS=$' \t\n'
2583 array[${#array[@]}+1]="$c"
2586 compadd -Q -S '' -p "${2-}" -a -- array && _ret=0
2597 compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0
2606 compadd -Q -p "${2-}" -f -- ${=1} && _ret=0
2611 local _ret=1 cur cword prev
2612 cur=${words[CURRENT]}
2613 prev=${words[CURRENT-1]}
2615 emulate ksh -c __${service}_main
2616 let _ret && _default && _ret=0
2620 compdef _git git gitk
2626 local cur words cword prev
2627 _get_comp_words_by_ref -n =: cur words cword prev
2631 # Setup completion for certain functions defined above by setting common
2632 # variables and workarounds.
2633 # This is NOT a public function; use at your own risk.
2636 local wrapper="__git_wrap${2}"
2637 eval "$wrapper () { __git_func_wrap $2 ; }"
2638 complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \
2639 || complete -o default -o nospace -F $wrapper $1
2642 # wrapper for backwards compatibility
2645 __git_wrap__git_main
2648 # wrapper for backwards compatibility
2651 __git_wrap__gitk_main
2654 __git_complete git __git_main
2655 __git_complete gitk __gitk_main
2657 # The following are necessary only for Cygwin, and only are needed
2658 # when the user has tab-completed the executable name and consequently
2659 # included the '.exe' suffix.
2661 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
2662 __git_complete git.exe __git_main