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 ()
266 if [ "$2" == "--committable" ]; then
267 git -C "$1" diff-index --name-only --relative HEAD
269 # NOTE: $2 is not quoted in order to support multiple options
270 git -C "$1" ls-files --exclude-standard $2
275 # __git_index_files accepts 1 or 2 arguments:
276 # 1: Options to pass to ls-files (required).
277 # 2: A directory path (optional).
278 # If provided, only files within the specified directory are listed.
279 # Sub directories are never recursed. Path must have a trailing
283 local dir="$(__gitdir)" root="${2-.}" file
285 if [ -d "$dir" ]; then
286 __git_ls_files_helper "$root" "$1" |
287 while read -r file; do
289 ?*/*) echo "${file%%/*}" ;;
298 local dir="$(__gitdir)"
299 if [ -d "$dir" ]; then
300 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
308 local dir="$(__gitdir)"
309 if [ -d "$dir" ]; then
310 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
316 # __git_refs accepts 0, 1 (to pass to __gitdir), or 2 arguments
317 # presence of 2nd argument means use the guess heuristic employed
318 # by checkout for tracking branches
321 local i hash dir="$(__gitdir "${1-}")" track="${2-}"
323 if [ -d "$dir" ]; then
331 for i in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD; do
332 if [ -e "$dir/$i" ]; then echo $i; fi
334 format="refname:short"
335 refs="refs/tags refs/heads refs/remotes"
338 git --git-dir="$dir" for-each-ref --format="%($format)" \
340 if [ -n "$track" ]; then
341 # employ the heuristic used by git checkout
342 # Try to find a remote branch that matches the completion word
343 # but only output if the branch name is unique
345 git --git-dir="$dir" for-each-ref --shell --format="ref=%(refname:short)" \
347 while read -r entry; do
350 if [[ "$ref" == "$cur"* ]]; then
353 done | sort | uniq -u
359 git ls-remote "$dir" "$cur*" 2>/dev/null | \
360 while read -r hash i; do
369 git for-each-ref --format="%(refname:short)" -- "refs/remotes/$dir/" | sed -e "s#^$dir/##"
374 # __git_refs2 requires 1 argument (to pass to __git_refs)
378 for i in $(__git_refs "$1"); do
383 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
384 __git_refs_remotes ()
387 git ls-remote "$1" 'refs/heads/*' 2>/dev/null | \
388 while read -r hash i; do
389 echo "$i:refs/remotes/$1/${i#refs/heads/}"
395 local i IFS=$'\n' d="$(__gitdir)"
396 test -d "$d/remotes" && ls -1 "$d/remotes"
397 for i in $(git --git-dir="$d" config --get-regexp 'remote\..*\.url' 2>/dev/null); do
403 __git_list_merge_strategies ()
405 git merge -s help 2>&1 |
406 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
415 __git_merge_strategies=
416 # 'git merge -s help' (and thus detection of the merge strategy
417 # list) fails, unfortunately, if run outside of any git working
418 # tree. __git_merge_strategies is set to the empty string in
419 # that case, and the detection will be repeated the next time it
421 __git_compute_merge_strategies ()
423 test -n "$__git_merge_strategies" ||
424 __git_merge_strategies=$(__git_list_merge_strategies)
427 __git_complete_revlist_file ()
429 local pfx ls ref cur_="$cur"
449 case "$COMP_WORDBREAKS" in
451 *) pfx="$ref:$pfx" ;;
454 __gitcomp_nl "$(git --git-dir="$(__gitdir)" ls-tree "$ls" 2>/dev/null \
455 | sed '/^100... blob /{
471 pfx="${cur_%...*}..."
473 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
478 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
481 __gitcomp_nl "$(__git_refs)"
487 # __git_complete_index_file requires 1 argument:
488 # 1: the options to pass to ls-file
490 # The exception is --committable, which finds the files appropriate commit.
491 __git_complete_index_file ()
493 local pfx="" cur_="$cur"
503 __gitcomp_file "$(__git_index_files "$1" ${pfx:+"$pfx"})" "$pfx" "$cur_"
506 __git_complete_file ()
508 __git_complete_revlist_file
511 __git_complete_revlist ()
513 __git_complete_revlist_file
516 __git_complete_remote_or_refspec ()
518 local cur_="$cur" cmd="${words[1]}"
519 local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0
520 if [ "$cmd" = "remote" ]; then
523 while [ $c -lt $cword ]; do
526 --mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
529 push) no_complete_refspec=1 ;;
537 *) remote="$i"; break ;;
541 if [ -z "$remote" ]; then
542 __gitcomp_nl "$(__git_remotes)"
545 if [ $no_complete_refspec = 1 ]; then
548 [ "$remote" = "." ] && remote=
551 case "$COMP_WORDBREAKS" in
553 *) pfx="${cur_%%:*}:" ;;
565 if [ $lhs = 1 ]; then
566 __gitcomp_nl "$(__git_refs2 "$remote")" "$pfx" "$cur_"
568 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
572 if [ $lhs = 1 ]; then
573 __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
575 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
579 if [ $lhs = 1 ]; then
580 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
582 __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
588 __git_complete_strategy ()
590 __git_compute_merge_strategies
593 __gitcomp "$__git_merge_strategies"
598 __gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}"
606 if test -n "${GIT_TESTING_COMMAND_COMPLETION:-}"
608 printf "%s" "${GIT_TESTING_COMMAND_COMPLETION}"
610 git help -a|egrep '^ [a-zA-Z0-9]'
614 __git_list_all_commands ()
617 for i in $(__git_commands)
620 *--*) : helper pattern;;
627 __git_compute_all_commands ()
629 test -n "$__git_all_commands" ||
630 __git_all_commands=$(__git_list_all_commands)
633 __git_list_porcelain_commands ()
636 __git_compute_all_commands
637 for i in $__git_all_commands
640 *--*) : helper pattern;;
641 applymbox) : ask gittus;;
642 applypatch) : ask gittus;;
643 archimport) : import;;
644 cat-file) : plumbing;;
645 check-attr) : plumbing;;
646 check-ignore) : plumbing;;
647 check-mailmap) : plumbing;;
648 check-ref-format) : plumbing;;
649 checkout-index) : plumbing;;
650 commit-tree) : plumbing;;
651 count-objects) : infrequent;;
652 credential-cache) : credentials helper;;
653 credential-store) : credentials helper;;
654 cvsexportcommit) : export;;
655 cvsimport) : import;;
656 cvsserver) : daemon;;
658 diff-files) : plumbing;;
659 diff-index) : plumbing;;
660 diff-tree) : plumbing;;
661 fast-import) : import;;
662 fast-export) : export;;
663 fsck-objects) : plumbing;;
664 fetch-pack) : plumbing;;
665 fmt-merge-msg) : plumbing;;
666 for-each-ref) : plumbing;;
667 hash-object) : plumbing;;
668 http-*) : transport;;
669 index-pack) : plumbing;;
670 init-db) : deprecated;;
671 local-fetch) : plumbing;;
672 lost-found) : infrequent;;
673 ls-files) : plumbing;;
674 ls-remote) : plumbing;;
675 ls-tree) : plumbing;;
676 mailinfo) : plumbing;;
677 mailsplit) : plumbing;;
678 merge-*) : plumbing;;
681 pack-objects) : plumbing;;
682 pack-redundant) : plumbing;;
683 pack-refs) : plumbing;;
684 parse-remote) : plumbing;;
685 patch-id) : plumbing;;
686 peek-remote) : plumbing;;
688 prune-packed) : plumbing;;
689 quiltimport) : import;;
690 read-tree) : plumbing;;
691 receive-pack) : plumbing;;
692 remote-*) : transport;;
693 repo-config) : deprecated;;
695 rev-list) : plumbing;;
696 rev-parse) : plumbing;;
697 runstatus) : plumbing;;
698 sh-setup) : internal;;
700 show-ref) : plumbing;;
701 send-pack) : plumbing;;
702 show-index) : plumbing;;
704 stripspace) : plumbing;;
705 symbolic-ref) : plumbing;;
706 tar-tree) : deprecated;;
707 unpack-file) : plumbing;;
708 unpack-objects) : plumbing;;
709 update-index) : plumbing;;
710 update-ref) : plumbing;;
711 update-server-info) : daemon;;
712 upload-archive) : plumbing;;
713 upload-pack) : plumbing;;
714 write-tree) : plumbing;;
716 verify-pack) : infrequent;;
717 verify-tag) : plumbing;;
723 __git_porcelain_commands=
724 __git_compute_porcelain_commands ()
726 __git_compute_all_commands
727 test -n "$__git_porcelain_commands" ||
728 __git_porcelain_commands=$(__git_list_porcelain_commands)
731 __git_pretty_aliases ()
734 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "pretty\..*" 2>/dev/null); do
747 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "alias\..*" 2>/dev/null); do
757 # __git_aliased_command requires 1 argument
758 __git_aliased_command ()
760 local word cmdline=$(git --git-dir="$(__gitdir)" \
761 config --get "alias.$1")
762 for word in $cmdline; do
768 \!*) : shell command alias ;;
770 *=*) : setting env ;;
779 # __git_find_on_cmdline requires 1 argument
780 __git_find_on_cmdline ()
782 local word subcommand c=1
783 while [ $c -lt $cword ]; do
785 for subcommand in $1; do
786 if [ "$subcommand" = "$word" ]; then
795 __git_has_doubledash ()
798 while [ $c -lt $cword ]; do
799 if [ "--" = "${words[c]}" ]; then
807 # Try to count non option arguments passed on the command line for the
808 # specified git command.
809 # When options are used, it is necessary to use the special -- option to
810 # tell the implementation were non option arguments begin.
811 # XXX this can not be improved, since options can appear everywhere, as
815 # __git_count_arguments requires 1 argument: the git command executed.
816 __git_count_arguments ()
820 # Skip "git" (first argument)
821 for ((i=1; i < ${#words[@]}; i++)); do
826 # Good; we can assume that the following are only non
831 # Skip the specified git command and discard git
844 __git_whitespacelist="nowarn warn error error-all fix"
848 local dir="$(__gitdir)"
849 if [ -d "$dir"/rebase-apply ]; then
850 __gitcomp "--skip --continue --resolved --abort"
855 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
860 --3way --committer-date-is-author-date --ignore-date
861 --ignore-whitespace --ignore-space-change
862 --interactive --keep --no-utf8 --signoff --utf8
863 --whitespace= --scissors
873 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
878 --stat --numstat --summary --check --index
879 --cached --index-info --reverse --reject --unidiff-zero
880 --apply --no-add --exclude=
881 --ignore-whitespace --ignore-space-change
882 --whitespace= --inaccurate-eof --verbose
893 --interactive --refresh --patch --update --dry-run
894 --ignore-errors --intent-to-add
899 # XXX should we check for --update and --all options ?
900 __git_complete_index_file "--others --modified --directory --no-empty-directory"
907 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
911 __gitcomp_nl "$(__git_remotes)" "" "${cur##--remote=}"
916 --format= --list --verbose
917 --prefix= --remote= --exec=
927 __git_has_doubledash && return
929 local subcommands="start bad good skip reset visualize replay log run"
930 local subcommand="$(__git_find_on_cmdline "$subcommands")"
931 if [ -z "$subcommand" ]; then
932 if [ -f "$(__gitdir)"/BISECT_START ]; then
933 __gitcomp "$subcommands"
935 __gitcomp "replay start"
940 case "$subcommand" in
941 bad|good|reset|skip|start)
942 __gitcomp_nl "$(__git_refs)"
951 local i c=1 only_local_ref="n" has_r="n"
953 while [ $c -lt $cword ]; do
956 -d|-m) only_local_ref="y" ;;
964 __gitcomp "$(__git_refs)" "" "${cur##--set-upstream-to=}"
968 --color --no-color --verbose --abbrev= --no-abbrev
969 --track --no-track --contains --merged --no-merged
970 --set-upstream-to= --edit-description --list
975 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
976 __gitcomp_nl "$(__git_heads)"
978 __gitcomp_nl "$(__git_refs)"
986 local cmd="${words[2]}"
989 __gitcomp "create list-heads verify unbundle"
997 __git_complete_revlist
1006 __git_has_doubledash && return
1010 __gitcomp "diff3 merge" "" "${cur##--conflict=}"
1014 --quiet --ours --theirs --track --no-track --merge
1015 --conflict= --orphan --patch
1019 # check if --track, --no-track, or --no-guess was specified
1020 # if so, disable DWIM mode
1021 local flags="--track --no-track --no-guess" track=1
1022 if [ -n "$(__git_find_on_cmdline "$flags")" ]; then
1025 __gitcomp_nl "$(__git_refs '' $track)"
1032 __gitcomp "$(__git_refs)"
1037 local dir="$(__gitdir)"
1038 if [ -f "$dir"/CHERRY_PICK_HEAD ]; then
1039 __gitcomp "--continue --quit --abort"
1044 __gitcomp "--edit --no-commit --signoff --strategy= --mainline"
1047 __gitcomp_nl "$(__git_refs)"
1056 __gitcomp "--dry-run --quiet"
1061 # XXX should we check for -x option ?
1062 __git_complete_index_file "--others --directory"
1094 __gitcomp_nl "$(__git_refs)" "" "${cur}"
1101 __gitcomp "default strip verbatim whitespace
1102 " "" "${cur##--cleanup=}"
1105 --reuse-message=*|--reedit-message=*|\
1106 --fixup=*|--squash=*)
1107 __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1110 --untracked-files=*)
1111 __gitcomp "all no normal" "" "${cur##--untracked-files=}"
1116 --all --author= --signoff --verify --no-verify
1118 --amend --include --only --interactive
1119 --dry-run --reuse-message= --reedit-message=
1120 --reset-author --file= --message= --template=
1121 --cleanup= --untracked-files --untracked-files=
1122 --verbose --quiet --fixup= --squash=
1127 if git rev-parse --verify --quiet HEAD >/dev/null; then
1128 __git_complete_index_file "--committable"
1130 # This is the first commit
1131 __git_complete_index_file "--cached"
1140 --all --tags --contains --abbrev= --candidates=
1141 --exact-match --debug --long --match --always
1145 __gitcomp_nl "$(__git_refs)"
1148 __git_diff_algorithms="myers minimal patience histogram"
1150 __git_diff_common_options="--stat --numstat --shortstat --summary
1151 --patch-with-stat --name-only --name-status --color
1152 --no-color --color-words --no-renames --check
1153 --full-index --binary --abbrev --diff-filter=
1154 --find-copies-harder
1155 --text --ignore-space-at-eol --ignore-space-change
1156 --ignore-all-space --exit-code --quiet --ext-diff
1158 --no-prefix --src-prefix= --dst-prefix=
1159 --inter-hunk-context=
1160 --patience --histogram --minimal
1162 --dirstat --dirstat= --dirstat-by-file
1163 --dirstat-by-file= --cumulative
1169 __git_has_doubledash && return
1173 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
1177 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1178 --base --ours --theirs --no-index
1179 $__git_diff_common_options
1184 __git_complete_revlist_file
1187 __git_mergetools_common="diffuse diffmerge ecmerge emerge kdiff3 meld opendiff
1188 tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc3 codecompare
1193 __git_has_doubledash && return
1197 __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
1201 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1202 --base --ours --theirs
1203 --no-renames --diff-filter= --find-copies-harder
1204 --relative --ignore-submodules
1209 __git_complete_revlist_file
1212 __git_fetch_options="
1213 --quiet --verbose --append --upload-pack --force --keep --depth=
1214 --tags --no-tags --all --prune --dry-run
1221 __gitcomp "$__git_fetch_options"
1225 __git_complete_remote_or_refspec
1228 __git_format_patch_options="
1229 --stdout --attach --no-attach --thread --thread= --no-thread
1230 --numbered --start-number --numbered-files --keep-subject --signoff
1231 --signature --no-signature --in-reply-to= --cc= --full-index --binary
1232 --not --all --cover-letter --no-prefix --src-prefix= --dst-prefix=
1233 --inline --suffix= --ignore-if-in-upstream --subject-prefix=
1234 --output-directory --reroll-count --to= --quiet --notes
1237 _git_format_patch ()
1243 " "" "${cur##--thread=}"
1247 __gitcomp "$__git_format_patch_options"
1251 __git_complete_revlist
1259 --tags --root --unreachable --cache --no-reflogs --full
1260 --strict --verbose --lost-found
1271 __gitcomp "--prune --aggressive"
1282 __git_match_ctag() {
1283 awk "/^${1////\\/}/ { print \$1 }" "$2"
1288 __git_has_doubledash && return
1294 --text --ignore-case --word-regexp --invert-match
1295 --full-name --line-number
1296 --extended-regexp --basic-regexp --fixed-strings
1298 --files-with-matches --name-only
1299 --files-without-match
1302 --and --or --not --all-match
1308 case "$cword,$prev" in
1310 if test -r tags; then
1311 __gitcomp_nl "$(__git_match_ctag "$cur" tags)"
1317 __gitcomp_nl "$(__git_refs)"
1324 __gitcomp "--all --info --man --web"
1328 __git_compute_all_commands
1329 __gitcomp "$__git_all_commands $(__git_aliases)
1330 attributes cli core-tutorial cvs-migration
1331 diffcore gitk glossary hooks ignore modules
1332 namespaces repository-layout tutorial tutorial-2
1342 false true umask group all world everybody
1343 " "" "${cur##--shared=}"
1347 __gitcomp "--quiet --bare --template= --shared --shared="
1357 __gitcomp "--cached --deleted --modified --others --ignored
1358 --stage --directory --no-empty-directory --unmerged
1359 --killed --exclude= --exclude-from=
1360 --exclude-per-directory= --exclude-standard
1361 --error-unmatch --with-tree= --full-name
1362 --abbrev --ignored --exclude-per-directory
1368 # XXX ignore options like --modified and always suggest all cached
1370 __git_complete_index_file "--cached"
1375 __gitcomp_nl "$(__git_remotes)"
1383 # Options that go well for log, shortlog and gitk
1384 __git_log_common_options="
1386 --branches --tags --remotes
1387 --first-parent --merges --no-merges
1389 --max-age= --since= --after=
1390 --min-age= --until= --before=
1391 --min-parents= --max-parents=
1392 --no-min-parents --no-max-parents
1394 # Options that go well for log and gitk (not shortlog)
1395 __git_log_gitk_options="
1396 --dense --sparse --full-history
1397 --simplify-merges --simplify-by-decoration
1398 --left-right --notes --no-notes
1400 # Options that go well for log and shortlog (not gitk)
1401 __git_log_shortlog_options="
1402 --author= --committer= --grep=
1406 __git_log_pretty_formats="oneline short medium full fuller email raw format:"
1407 __git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1411 __git_has_doubledash && return
1413 local g="$(git rev-parse --git-dir 2>/dev/null)"
1415 if [ -f "$g/MERGE_HEAD" ]; then
1419 --pretty=*|--format=*)
1420 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
1425 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1429 __gitcomp "long short" "" "${cur##--decorate=}"
1434 $__git_log_common_options
1435 $__git_log_shortlog_options
1436 $__git_log_gitk_options
1437 --root --topo-order --date-order --reverse
1438 --follow --full-diff
1439 --abbrev-commit --abbrev=
1440 --relative-date --date=
1441 --pretty= --format= --oneline
1444 --decorate --decorate=
1446 --parents --children
1448 $__git_diff_common_options
1449 --pickaxe-all --pickaxe-regex
1454 __git_complete_revlist
1457 __git_merge_options="
1458 --no-commit --no-stat --log --no-log --squash --strategy
1459 --commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit
1464 __git_complete_strategy && return
1468 __gitcomp "$__git_merge_options"
1471 __gitcomp_nl "$(__git_refs)"
1478 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1490 __gitcomp_nl "$(__git_refs)"
1497 __gitcomp "--dry-run"
1502 if [ $(__git_count_arguments "mv") -gt 0 ]; then
1503 # We need to show both cached and untracked files (including
1504 # empty directories) since this may not be the last argument.
1505 __git_complete_index_file "--cached --others --directory"
1507 __git_complete_index_file "--cached"
1513 __gitcomp "--tags --all --stdin"
1518 local subcommands='add append copy edit list prune remove show'
1519 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1521 case "$subcommand,$cur" in
1528 __gitcomp_nl "$(__git_refs)"
1531 __gitcomp "$subcommands --ref"
1535 add,--reuse-message=*|append,--reuse-message=*|\
1536 add,--reedit-message=*|append,--reedit-message=*)
1537 __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1540 __gitcomp '--file= --message= --reedit-message=
1547 __gitcomp '--dry-run --verbose'
1556 __gitcomp_nl "$(__git_refs)"
1565 __git_complete_strategy && return
1570 --rebase --no-rebase
1571 $__git_merge_options
1572 $__git_fetch_options
1577 __git_complete_remote_or_refspec
1584 __gitcomp_nl "$(__git_remotes)"
1589 __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}"
1594 --all --mirror --tags --dry-run --force --verbose
1595 --receive-pack= --repo= --set-upstream
1600 __git_complete_remote_or_refspec
1605 local dir="$(__gitdir)"
1606 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1607 __gitcomp "--continue --skip --abort"
1610 __git_complete_strategy && return
1613 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1618 --onto --merge --strategy --interactive
1619 --preserve-merges --stat --no-stat
1620 --committer-date-is-author-date --ignore-date
1621 --ignore-whitespace --whitespace=
1627 __gitcomp_nl "$(__git_refs)"
1632 local subcommands="show delete expire"
1633 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1635 if [ -z "$subcommand" ]; then
1636 __gitcomp "$subcommands"
1638 __gitcomp_nl "$(__git_refs)"
1642 __git_send_email_confirm_options="always never auto cc compose"
1643 __git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
1650 $__git_send_email_confirm_options
1651 " "" "${cur##--confirm=}"
1656 $__git_send_email_suppresscc_options
1657 " "" "${cur##--suppress-cc=}"
1661 --smtp-encryption=*)
1662 __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1668 " "" "${cur##--thread=}"
1672 __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1673 --compose --confirm= --dry-run --envelope-sender
1675 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1676 --no-suppress-from --no-thread --quiet
1677 --signed-off-by-cc --smtp-pass --smtp-server
1678 --smtp-server-port --smtp-encryption= --smtp-user
1679 --subject --suppress-cc= --suppress-from --thread --to
1680 --validate --no-validate
1681 $__git_format_patch_options"
1685 __git_complete_revlist
1693 __git_config_get_set_variables ()
1695 local prevword word config_file= c=$cword
1696 while [ $c -gt 1 ]; do
1699 --system|--global|--local|--file=*)
1704 config_file="$word $prevword"
1712 git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null |
1726 branch.*.remote|branch.*.pushremote)
1727 __gitcomp_nl "$(__git_remotes)"
1731 __gitcomp_nl "$(__git_refs)"
1735 __gitcomp "false true"
1739 __gitcomp_nl "$(__git_remotes)"
1743 local remote="${prev#remote.}"
1744 remote="${remote%.fetch}"
1745 if [ -z "$cur" ]; then
1746 __gitcomp_nl "refs/heads/" "" "" ""
1749 __gitcomp_nl "$(__git_refs_remotes "$remote")"
1753 local remote="${prev#remote.}"
1754 remote="${remote%.push}"
1755 __gitcomp_nl "$(git --git-dir="$(__gitdir)" \
1756 for-each-ref --format='%(refname):%(refname)' \
1760 pull.twohead|pull.octopus)
1761 __git_compute_merge_strategies
1762 __gitcomp "$__git_merge_strategies"
1765 color.branch|color.diff|color.interactive|\
1766 color.showbranch|color.status|color.ui)
1767 __gitcomp "always never auto"
1771 __gitcomp "false true"
1776 normal black red green yellow blue magenta cyan white
1777 bold dim ul blink reverse
1782 __gitcomp "log short"
1786 __gitcomp "man info web html"
1790 __gitcomp "$__git_log_date_formats"
1793 sendemail.aliasesfiletype)
1794 __gitcomp "mutt mailrc pine elm gnus"
1798 __gitcomp "$__git_send_email_confirm_options"
1801 sendemail.suppresscc)
1802 __gitcomp "$__git_send_email_suppresscc_options"
1805 --get|--get-all|--unset|--unset-all)
1806 __gitcomp_nl "$(__git_config_get_set_variables)"
1816 --system --global --local --file=
1817 --list --replace-all
1818 --get --get-all --get-regexp
1819 --add --unset --unset-all
1820 --remove-section --rename-section
1825 local pfx="${cur%.*}." cur_="${cur##*.}"
1826 __gitcomp "remote pushremote merge mergeoptions rebase" "$pfx" "$cur_"
1830 local pfx="${cur%.*}." cur_="${cur#*.}"
1831 __gitcomp_nl "$(__git_heads)" "$pfx" "$cur_" "."
1835 local pfx="${cur%.*}." cur_="${cur##*.}"
1837 argprompt cmd confirm needsfile noconsole norescan
1838 prompt revprompt revunmerged title
1843 local pfx="${cur%.*}." cur_="${cur##*.}"
1844 __gitcomp "cmd path" "$pfx" "$cur_"
1848 local pfx="${cur%.*}." cur_="${cur##*.}"
1849 __gitcomp "cmd path" "$pfx" "$cur_"
1853 local pfx="${cur%.*}." cur_="${cur##*.}"
1854 __gitcomp "cmd path trustExitCode" "$pfx" "$cur_"
1858 local pfx="${cur%.*}." cur_="${cur#*.}"
1859 __git_compute_all_commands
1860 __gitcomp_nl "$__git_all_commands" "$pfx" "$cur_"
1864 local pfx="${cur%.*}." cur_="${cur##*.}"
1866 url proxy fetch push mirror skipDefaultUpdate
1867 receivepack uploadpack tagopt pushurl
1872 local pfx="${cur%.*}." cur_="${cur#*.}"
1873 __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
1877 local pfx="${cur%.*}." cur_="${cur##*.}"
1878 __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_"
1884 advice.commitBeforeMerge
1886 advice.implicitIdentity
1887 advice.pushNonFastForward
1888 advice.resolveConflict
1892 apply.ignorewhitespace
1894 branch.autosetupmerge
1895 branch.autosetuprebase
1899 color.branch.current
1904 color.decorate.branch
1905 color.decorate.remoteBranch
1906 color.decorate.stash
1916 color.diff.whitespace
1921 color.grep.linenumber
1924 color.grep.separator
1926 color.interactive.error
1927 color.interactive.header
1928 color.interactive.help
1929 color.interactive.prompt
1934 color.status.changed
1936 color.status.nobranch
1937 color.status.untracked
1938 color.status.updated
1947 core.bigFileThreshold
1950 core.deltaBaseCacheLimit
1955 core.fsyncobjectfiles
1959 core.logAllRefUpdates
1960 core.loosecompression
1963 core.packedGitWindowSize
1965 core.preferSymlinkRefs
1968 core.repositoryFormatVersion
1970 core.sharedRepository
1974 core.warnAmbiguousRefs
1977 diff.autorefreshindex
1979 diff.ignoreSubmodules
1986 diff.suppressBlankEmpty
1992 fetch.recurseSubmodules
2001 format.subjectprefix
2012 gc.reflogexpireunreachable
2016 gitcvs.commitmsgannotation
2017 gitcvs.dbTableNamePrefix
2028 gui.copyblamethreshold
2032 gui.matchtrackingbranch
2033 gui.newbranchtemplate
2034 gui.pruneduringfetch
2035 gui.spellingdictionary
2050 http.sslCertPasswordProtected
2055 i18n.logOutputEncoding
2061 imap.preformattedHTML
2071 interactive.singlekey
2087 mergetool.keepBackup
2088 mergetool.keepTemporaries
2093 notes.rewrite.rebase
2097 pack.deltaCacheLimit
2113 receive.denyCurrentBranch
2114 receive.denyDeleteCurrent
2116 receive.denyNonFastForwards
2119 receive.updateserverinfo
2122 repack.usedeltabaseoffset
2126 sendemail.aliasesfile
2127 sendemail.aliasfiletype
2131 sendemail.chainreplyto
2133 sendemail.envelopesender
2137 sendemail.signedoffbycc
2138 sendemail.smtpdomain
2139 sendemail.smtpencryption
2141 sendemail.smtpserver
2142 sendemail.smtpserveroption
2143 sendemail.smtpserverport
2145 sendemail.suppresscc
2146 sendemail.suppressfrom
2151 status.relativePaths
2152 status.showUntrackedFiles
2153 status.submodulesummary
2156 transfer.unpackLimit
2168 local subcommands="add rename remove set-head set-branches set-url show prune update"
2169 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2170 if [ -z "$subcommand" ]; then
2171 __gitcomp "$subcommands"
2175 case "$subcommand" in
2176 rename|remove|set-url|show|prune)
2177 __gitcomp_nl "$(__git_remotes)"
2179 set-head|set-branches)
2180 __git_complete_remote_or_refspec
2183 local i c='' IFS=$'\n'
2184 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "remotes\..*" 2>/dev/null); do
2197 __gitcomp_nl "$(__git_refs)"
2202 __git_has_doubledash && return
2206 __gitcomp "--merge --mixed --hard --soft --patch"
2210 __gitcomp_nl "$(__git_refs)"
2217 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
2221 __gitcomp_nl "$(__git_refs)"
2228 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
2233 __git_complete_index_file "--cached"
2238 __git_has_doubledash && return
2243 $__git_log_common_options
2244 $__git_log_shortlog_options
2245 --numbered --summary
2250 __git_complete_revlist
2255 __git_has_doubledash && return
2258 --pretty=*|--format=*)
2259 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
2264 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
2268 __gitcomp "--pretty= --format= --abbrev-commit --oneline
2269 $__git_diff_common_options
2274 __git_complete_revlist_file
2282 --all --remotes --topo-order --current --more=
2283 --list --independent --merge-base --no-name
2285 --sha1-name --sparse --topics --reflog
2290 __git_complete_revlist
2295 local save_opts='--keep-index --no-keep-index --quiet --patch'
2296 local subcommands='save list show apply clear drop pop create branch'
2297 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2298 if [ -z "$subcommand" ]; then
2301 __gitcomp "$save_opts"
2304 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2305 __gitcomp "$subcommands"
2310 case "$subcommand,$cur" in
2312 __gitcomp "$save_opts"
2315 __gitcomp "--index --quiet"
2317 show,--*|drop,--*|branch,--*)
2319 show,*|apply,*|drop,*|pop,*|branch,*)
2320 __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
2321 | sed -n -e 's/:.*//p')"
2331 __git_has_doubledash && return
2333 local subcommands="add status init deinit update summary foreach sync"
2334 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2337 __gitcomp "--quiet --cached"
2340 __gitcomp "$subcommands"
2350 init fetch clone rebase dcommit log find-rev
2351 set-tree commit-diff info create-ignore propget
2352 proplist show-ignore show-externals branch tag blame
2353 migrate mkdirs reset gc
2355 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2356 if [ -z "$subcommand" ]; then
2357 __gitcomp "$subcommands"
2359 local remote_opts="--username= --config-dir= --no-auth-cache"
2361 --follow-parent --authors-file= --repack=
2362 --no-metadata --use-svm-props --use-svnsync-props
2363 --log-window-size= --no-checkout --quiet
2364 --repack-flags --use-log-author --localtime
2365 --ignore-paths= --include-paths= $remote_opts
2368 --template= --shared= --trunk= --tags=
2369 --branches= --stdlayout --minimize-url
2370 --no-metadata --use-svm-props --use-svnsync-props
2371 --rewrite-root= --prefix= --use-log-author
2372 --add-author-from $remote_opts
2375 --edit --rmdir --find-copies-harder --copy-similarity=
2378 case "$subcommand,$cur" in
2380 __gitcomp "--revision= --fetch-all $fc_opts"
2383 __gitcomp "--revision= $fc_opts $init_opts"
2386 __gitcomp "$init_opts"
2390 --merge --strategy= --verbose --dry-run
2391 --fetch-all --no-rebase --commit-url
2392 --revision --interactive $cmt_opts $fc_opts
2396 __gitcomp "--stdin $cmt_opts $fc_opts"
2398 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
2399 show-externals,--*|mkdirs,--*)
2400 __gitcomp "--revision="
2404 --limit= --revision= --verbose --incremental
2405 --oneline --show-commit --non-recursive
2406 --authors-file= --color
2411 --merge --verbose --strategy= --local
2412 --fetch-all --dry-run $fc_opts
2416 __gitcomp "--message= --file= --revision= $cmt_opts"
2422 __gitcomp "--dry-run --message --tag"
2425 __gitcomp "--dry-run --message"
2428 __gitcomp "--git-format"
2432 --config-dir= --ignore-paths= --minimize
2433 --no-auth-cache --username=
2437 __gitcomp "--revision= --parent"
2448 while [ $c -lt $cword ]; do
2452 __gitcomp_nl "$(__git_tags)"
2467 __gitcomp_nl "$(__git_tags)"
2471 __gitcomp_nl "$(__git_refs)"
2483 local i c=1 command __git_dir
2485 while [ $c -lt $cword ]; do
2488 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2489 --git-dir) ((c++)) ; __git_dir="${words[c]}" ;;
2490 --bare) __git_dir="." ;;
2491 --help) command="help"; break ;;
2492 -c|--work-tree|--namespace) ((c++)) ;;
2494 *) command="$i"; break ;;
2499 if [ -z "$command" ]; then
2514 --no-replace-objects
2518 *) __git_compute_porcelain_commands
2519 __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
2524 local completion_func="_git_${command//-/_}"
2525 declare -f $completion_func >/dev/null && $completion_func && return
2527 local expansion=$(__git_aliased_command "$command")
2528 if [ -n "$expansion" ]; then
2529 completion_func="_git_${expansion//-/_}"
2530 declare -f $completion_func >/dev/null && $completion_func
2536 __git_has_doubledash && return
2538 local g="$(__gitdir)"
2540 if [ -f "$g/MERGE_HEAD" ]; then
2546 $__git_log_common_options
2547 $__git_log_gitk_options
2553 __git_complete_revlist
2556 if [[ -n ${ZSH_VERSION-} ]]; then
2557 echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
2559 autoload -U +X compinit && compinit
2565 local cur_="${3-$cur}"
2571 local c IFS=$' \t\n'
2579 array[${#array[@]}+1]="$c"
2582 compadd -Q -S '' -p "${2-}" -a -- array && _ret=0
2593 compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0
2602 compadd -Q -p "${2-}" -f -- ${=1} && _ret=0
2607 local _ret=1 cur cword prev
2608 cur=${words[CURRENT]}
2609 prev=${words[CURRENT-1]}
2611 emulate ksh -c __${service}_main
2612 let _ret && _default && _ret=0
2616 compdef _git git gitk
2622 local cur words cword prev
2623 _get_comp_words_by_ref -n =: cur words cword prev
2627 # Setup completion for certain functions defined above by setting common
2628 # variables and workarounds.
2629 # This is NOT a public function; use at your own risk.
2632 local wrapper="__git_wrap${2}"
2633 eval "$wrapper () { __git_func_wrap $2 ; }"
2634 complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \
2635 || complete -o default -o nospace -F $wrapper $1
2638 # wrapper for backwards compatibility
2641 __git_wrap__git_main
2644 # wrapper for backwards compatibility
2647 __git_wrap__gitk_main
2650 __git_complete git __git_main
2651 __git_complete gitk __gitk_main
2653 # The following are necessary only for Cygwin, and only are needed
2654 # when the user has tab-completed the executable name and consequently
2655 # included the '.exe' suffix.
2657 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
2658 __git_complete git.exe __git_main