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 # *) common --long-options
18 # To use these routines:
20 # 1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
21 # 2) Add the following line to your .bashrc/.zshrc:
22 # source ~/.git-completion.sh
24 # 3) Consider changing your PS1 to also show the current branch:
25 # Bash: PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
26 # ZSH: PS1='[%n@%m %c$(__git_ps1 " (%s)")]\$ '
28 # The argument to __git_ps1 will be displayed only if you
29 # are currently in a git repository. The %s token will be
30 # the name of the current branch.
32 # In addition, if you set GIT_PS1_SHOWDIRTYSTATE to a nonempty
33 # value, unstaged (*) and staged (+) changes will be shown next
34 # to the branch name. You can configure this per-repository
35 # with the bash.showDirtyState variable, which defaults to true
36 # once GIT_PS1_SHOWDIRTYSTATE is enabled.
38 # You can also see if currently something is stashed, by setting
39 # GIT_PS1_SHOWSTASHSTATE to a nonempty value. If something is stashed,
40 # then a '$' will be shown next to the branch name.
42 # If you would like to see if there're untracked files, then you can
43 # set GIT_PS1_SHOWUNTRACKEDFILES to a nonempty value. If there're
44 # untracked files, then a '%' will be shown next to the branch name.
46 # If you would like to see the difference between HEAD and its
47 # upstream, set GIT_PS1_SHOWUPSTREAM="auto". A "<" indicates
48 # you are behind, ">" indicates you are ahead, and "<>"
49 # indicates you have diverged. You can further control
50 # behaviour by setting GIT_PS1_SHOWUPSTREAM to a space-separated
52 # verbose show number of commits ahead/behind (+/-) upstream
53 # legacy don't use the '--count' option available in recent
54 # versions of git-rev-list
55 # git always compare HEAD to @{upstream}
56 # svn always compare HEAD to your SVN upstream
57 # By default, __git_ps1 will compare HEAD to your SVN upstream
58 # if it can find one, or @{upstream} otherwise. Once you have
59 # set GIT_PS1_SHOWUPSTREAM, you can override it on a
60 # per-repository basis by setting the bash.showUpstream config
64 if [[ -n ${ZSH_VERSION-} ]]; then
65 autoload -U +X bashcompinit && bashcompinit
68 case "$COMP_WORDBREAKS" in
70 *) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
73 # __gitdir accepts 0 or 1 arguments (i.e., location)
74 # returns location of .git repo
77 if [ -z "${1-}" ]; then
78 if [ -n "${__git_dir-}" ]; then
80 elif [ -d .git ]; then
83 git rev-parse --git-dir 2>/dev/null
85 elif [ -d "$1/.git" ]; then
92 # stores the divergence from upstream in $p
93 # used by GIT_PS1_SHOWUPSTREAM
94 __git_ps1_show_upstream ()
97 local svn_remote svn_url_pattern count n
98 local upstream=git legacy="" verbose=""
101 # get some config options from git-config
102 local output="$(git config -z --get-regexp '^(svn-remote\..*\.url|bash\.showupstream)$' 2>/dev/null | tr '\0\n' '\n ')"
103 while read -r key value; do
106 GIT_PS1_SHOWUPSTREAM="$value"
107 if [[ -z "${GIT_PS1_SHOWUPSTREAM}" ]]; then
113 svn_remote[ $((${#svn_remote[@]} + 1)) ]="$value"
114 svn_url_pattern+="\\|$value"
115 upstream=svn+git # default upstream is SVN if available, else git
120 # parse configuration values
121 for option in ${GIT_PS1_SHOWUPSTREAM}; do
123 git|svn) upstream="$option" ;;
124 verbose) verbose=1 ;;
131 git) upstream="@{upstream}" ;;
133 # get the upstream from the "git-svn-id: ..." in a commit message
134 # (git-svn uses essentially the same procedure internally)
135 local svn_upstream=($(git log --first-parent -1 \
136 --grep="^git-svn-id: \(${svn_url_pattern#??}\)" 2>/dev/null))
137 if [[ 0 -ne ${#svn_upstream[@]} ]]; then
138 svn_upstream=${svn_upstream[ ${#svn_upstream[@]} - 2 ]}
139 svn_upstream=${svn_upstream%@*}
140 local n_stop="${#svn_remote[@]}"
141 for ((n=1; n <= n_stop; n++)); do
142 svn_upstream=${svn_upstream#${svn_remote[$n]}}
145 if [[ -z "$svn_upstream" ]]; then
146 # default branch name for checkouts with no layout:
147 upstream=${GIT_SVN_ID:-git-svn}
149 upstream=${svn_upstream#/}
151 elif [[ "svn+git" = "$upstream" ]]; then
152 upstream="@{upstream}"
157 # Find how many commits we are ahead/behind our upstream
158 if [[ -z "$legacy" ]]; then
159 count="$(git rev-list --count --left-right \
160 "$upstream"...HEAD 2>/dev/null)"
162 # produce equivalent output to --count for older versions of git
164 if commits="$(git rev-list --left-right "$upstream"...HEAD 2>/dev/null)"
166 local commit behind=0 ahead=0
167 for commit in $commits
170 "<"*) ((behind++)) ;;
174 count="$behind $ahead"
180 # calculate the result
181 if [[ -z "$verbose" ]]; then
185 "0 0") # equal to upstream
187 "0 "*) # ahead of upstream
189 *" 0") # behind upstream
191 *) # diverged from upstream
198 "0 0") # equal to upstream
200 "0 "*) # ahead of upstream
201 p=" u+${count#0 }" ;;
202 *" 0") # behind upstream
203 p=" u-${count% 0}" ;;
204 *) # diverged from upstream
205 p=" u+${count#* }-${count% *}" ;;
212 # __git_ps1 accepts 0 or 1 arguments (i.e., format string)
213 # returns text to add to bash PS1 prompt (includes branch name)
216 local g="$(__gitdir)"
220 if [ -f "$g/rebase-merge/interactive" ]; then
222 b="$(cat "$g/rebase-merge/head-name")"
223 elif [ -d "$g/rebase-merge" ]; then
225 b="$(cat "$g/rebase-merge/head-name")"
227 if [ -d "$g/rebase-apply" ]; then
228 if [ -f "$g/rebase-apply/rebasing" ]; then
230 elif [ -f "$g/rebase-apply/applying" ]; then
235 elif [ -f "$g/MERGE_HEAD" ]; then
237 elif [ -f "$g/CHERRY_PICK_HEAD" ]; then
239 elif [ -f "$g/BISECT_LOG" ]; then
243 b="$(git symbolic-ref HEAD 2>/dev/null)" || {
246 case "${GIT_PS1_DESCRIBE_STYLE-}" in
248 git describe --contains HEAD ;;
250 git describe --contains --all HEAD ;;
254 git describe --tags --exact-match HEAD ;;
255 esac 2>/dev/null)" ||
257 b="$(cut -c1-7 "$g/HEAD" 2>/dev/null)..." ||
270 if [ "true" = "$(git rev-parse --is-inside-git-dir 2>/dev/null)" ]; then
271 if [ "true" = "$(git rev-parse --is-bare-repository 2>/dev/null)" ]; then
276 elif [ "true" = "$(git rev-parse --is-inside-work-tree 2>/dev/null)" ]; then
277 if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ]; then
278 if [ "$(git config --bool bash.showDirtyState)" != "false" ]; then
279 git diff --no-ext-diff --quiet --exit-code || w="*"
280 if git rev-parse --quiet --verify HEAD >/dev/null; then
281 git diff-index --cached --quiet HEAD -- || i="+"
287 if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ]; then
288 git rev-parse --verify refs/stash >/dev/null 2>&1 && s="$"
291 if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ]; then
292 if [ -n "$(git ls-files --others --exclude-standard)" ]; then
297 if [ -n "${GIT_PS1_SHOWUPSTREAM-}" ]; then
298 __git_ps1_show_upstream
303 printf -- "${1:- (%s)}" "$c${b##refs/heads/}${f:+ $f}$r$p"
320 # The following function is based on code from:
322 # bash_completion - programmable completion functions for bash 3.2+
324 # Copyright © 2006-2008, Ian Macdonald <ian@caliban.org>
325 # © 2009-2010, Bash Completion Maintainers
326 # <bash-completion-devel@lists.alioth.debian.org>
328 # This program is free software; you can redistribute it and/or modify
329 # it under the terms of the GNU General Public License as published by
330 # the Free Software Foundation; either version 2, or (at your option)
333 # This program is distributed in the hope that it will be useful,
334 # but WITHOUT ANY WARRANTY; without even the implied warranty of
335 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
336 # GNU General Public License for more details.
338 # You should have received a copy of the GNU General Public License
339 # along with this program; if not, write to the Free Software Foundation,
340 # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
342 # The latest version of this software can be obtained here:
344 # http://bash-completion.alioth.debian.org/
348 # This function can be used to access a tokenized list of words
349 # on the command line:
351 # __git_reassemble_comp_words_by_ref '=:'
352 # if test "${words_[cword_-1]}" = -w
357 # The argument should be a collection of characters from the list of
358 # word completion separators (COMP_WORDBREAKS) to treat as ordinary
361 # This is roughly equivalent to going back in time and setting
362 # COMP_WORDBREAKS to exclude those characters. The intent is to
363 # make option types like --date=<type> and <rev>:<path> easy to
364 # recognize by treating each shell word as a single token.
366 # It is best not to set COMP_WORDBREAKS directly because the value is
367 # shared with other completion scripts. By the time the completion
368 # function gets called, COMP_WORDS has already been populated so local
369 # changes to COMP_WORDBREAKS have no effect.
371 # Output: words_, cword_, cur_.
373 __git_reassemble_comp_words_by_ref()
375 local exclude i j first
376 # Which word separators to exclude?
377 exclude="${1//[^$COMP_WORDBREAKS]}"
379 if [ -z "$exclude" ]; then
380 words_=("${COMP_WORDS[@]}")
383 # List of word completion separators has shrunk;
384 # re-assemble words to complete.
385 for ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)); do
386 # Append each nonempty word consisting of just
387 # word separator characters to the current word.
391 [ -n "${COMP_WORDS[$i]}" ] &&
392 # word consists of excluded word separators
393 [ "${COMP_WORDS[$i]//[^$exclude]}" = "${COMP_WORDS[$i]}" ]
395 # Attach to the previous token,
396 # unless the previous token is the command name.
397 if [ $j -ge 2 ] && [ -n "$first" ]; then
401 words_[$j]=${words_[j]}${COMP_WORDS[i]}
402 if [ $i = $COMP_CWORD ]; then
405 if (($i < ${#COMP_WORDS[@]} - 1)); then
412 words_[$j]=${words_[j]}${COMP_WORDS[i]}
413 if [ $i = $COMP_CWORD ]; then
419 if ! type _get_comp_words_by_ref >/dev/null 2>&1; then
420 if [[ -z ${ZSH_VERSION:+set} ]]; then
421 _get_comp_words_by_ref ()
423 local exclude cur_ words_ cword_
424 if [ "$1" = "-n" ]; then
428 __git_reassemble_comp_words_by_ref "$exclude"
429 cur_=${words_[cword_]}
430 while [ $# -gt 0 ]; do
436 prev=${words_[$cword_-1]}
439 words=("${words_[@]}")
449 _get_comp_words_by_ref ()
451 while [ $# -gt 0 ]; do
454 cur=${COMP_WORDS[COMP_CWORD]}
457 prev=${COMP_WORDS[COMP_CWORD-1]}
460 words=("${COMP_WORDS[@]}")
466 # assume COMP_WORDBREAKS is already set sanely
476 # Generates completion reply with compgen, appending a space to possible
477 # completion words, if necessary.
478 # It accepts 1 to 4 arguments:
479 # 1: List of possible completion words.
480 # 2: A prefix to be added to each possible completion word (optional).
481 # 3: Generate possible completion matches for this word (optional).
482 # 4: A suffix to be appended to each possible completion word (optional).
485 local cur_="${3-$cur}"
493 COMPREPLY=($(compgen -P "${2-}" \
494 -W "$(__gitcomp_1 "${1-}" "${4-}")" \
500 # Generates completion reply with compgen from newline-separated possible
501 # completion words by appending a space to all of them.
502 # It accepts 1 to 4 arguments:
503 # 1: List of possible completion words, separated by a single newline.
504 # 2: A prefix to be added to each possible completion word (optional).
505 # 3: Generate possible completion matches for this word (optional).
506 # 4: A suffix to be appended to each possible completion word instead of
507 # the default space (optional). If specified but empty, nothing is
512 COMPREPLY=($(compgen -P "${2-}" -S "${4- }" -W "$1" -- "${3-$cur}"))
517 local dir="$(__gitdir)"
518 if [ -d "$dir" ]; then
519 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
527 local dir="$(__gitdir)"
528 if [ -d "$dir" ]; then
529 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
535 # __git_refs accepts 0, 1 (to pass to __gitdir), or 2 arguments
536 # presence of 2nd argument means use the guess heuristic employed
537 # by checkout for tracking branches
540 local i hash dir="$(__gitdir "${1-}")" track="${2-}"
542 if [ -d "$dir" ]; then
550 for i in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD; do
551 if [ -e "$dir/$i" ]; then echo $i; fi
553 format="refname:short"
554 refs="refs/tags refs/heads refs/remotes"
557 git --git-dir="$dir" for-each-ref --format="%($format)" \
559 if [ -n "$track" ]; then
560 # employ the heuristic used by git checkout
561 # Try to find a remote branch that matches the completion word
562 # but only output if the branch name is unique
564 git --git-dir="$dir" for-each-ref --shell --format="ref=%(refname:short)" \
566 while read -r entry; do
569 if [[ "$ref" == "$cur"* ]]; then
578 git ls-remote "$dir" "$cur*" 2>/dev/null | \
579 while read -r hash i; do
587 git ls-remote "$dir" HEAD ORIG_HEAD 'refs/tags/*' 'refs/heads/*' 'refs/remotes/*' 2>/dev/null | \
588 while read -r hash i; do
591 refs/*) echo "${i#refs/*/}" ;;
599 # __git_refs2 requires 1 argument (to pass to __git_refs)
603 for i in $(__git_refs "$1"); do
608 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
609 __git_refs_remotes ()
612 git ls-remote "$1" 'refs/heads/*' 2>/dev/null | \
613 while read -r hash i; do
614 echo "$i:refs/remotes/$1/${i#refs/heads/}"
620 local i IFS=$'\n' d="$(__gitdir)"
621 test -d "$d/remotes" && ls -1 "$d/remotes"
622 for i in $(git --git-dir="$d" config --get-regexp 'remote\..*\.url' 2>/dev/null); do
628 __git_list_merge_strategies ()
630 git merge -s help 2>&1 |
631 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
640 __git_merge_strategies=
641 # 'git merge -s help' (and thus detection of the merge strategy
642 # list) fails, unfortunately, if run outside of any git working
643 # tree. __git_merge_strategies is set to the empty string in
644 # that case, and the detection will be repeated the next time it
646 __git_compute_merge_strategies ()
648 test -n "$__git_merge_strategies" ||
649 __git_merge_strategies=$(__git_list_merge_strategies)
652 __git_complete_revlist_file ()
654 local pfx ls ref cur_="$cur"
674 case "$COMP_WORDBREAKS" in
676 *) pfx="$ref:$pfx" ;;
680 COMPREPLY=($(compgen -P "$pfx" \
681 -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
682 | sed '/^100... blob /{
698 pfx="${cur_%...*}..."
700 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
705 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
708 __gitcomp_nl "$(__git_refs)"
714 __git_complete_file ()
716 __git_complete_revlist_file
719 __git_complete_revlist ()
721 __git_complete_revlist_file
724 __git_complete_remote_or_refspec ()
726 local cur_="$cur" cmd="${words[1]}"
727 local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0
728 if [ "$cmd" = "remote" ]; then
731 while [ $c -lt $cword ]; do
734 --mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
737 push) no_complete_refspec=1 ;;
746 *) remote="$i"; break ;;
750 if [ -z "$remote" ]; then
751 __gitcomp_nl "$(__git_remotes)"
754 if [ $no_complete_refspec = 1 ]; then
758 [ "$remote" = "." ] && remote=
761 case "$COMP_WORDBREAKS" in
763 *) pfx="${cur_%%:*}:" ;;
775 if [ $lhs = 1 ]; then
776 __gitcomp_nl "$(__git_refs2 "$remote")" "$pfx" "$cur_"
778 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
782 if [ $lhs = 1 ]; then
783 __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
785 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
789 if [ $lhs = 1 ]; then
790 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
792 __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
798 __git_complete_strategy ()
800 __git_compute_merge_strategies
803 __gitcomp "$__git_merge_strategies"
808 __gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}"
815 __git_list_all_commands ()
818 for i in $(git help -a|egrep '^ [a-zA-Z0-9]')
821 *--*) : helper pattern;;
828 __git_compute_all_commands ()
830 test -n "$__git_all_commands" ||
831 __git_all_commands=$(__git_list_all_commands)
834 __git_list_porcelain_commands ()
837 __git_compute_all_commands
838 for i in "help" $__git_all_commands
841 *--*) : helper pattern;;
842 applymbox) : ask gittus;;
843 applypatch) : ask gittus;;
844 archimport) : import;;
845 cat-file) : plumbing;;
846 check-attr) : plumbing;;
847 check-ref-format) : plumbing;;
848 checkout-index) : plumbing;;
849 commit-tree) : plumbing;;
850 count-objects) : infrequent;;
851 cvsexportcommit) : export;;
852 cvsimport) : import;;
853 cvsserver) : daemon;;
855 diff-files) : plumbing;;
856 diff-index) : plumbing;;
857 diff-tree) : plumbing;;
858 fast-import) : import;;
859 fast-export) : export;;
860 fsck-objects) : plumbing;;
861 fetch-pack) : plumbing;;
862 fmt-merge-msg) : plumbing;;
863 for-each-ref) : plumbing;;
864 hash-object) : plumbing;;
865 http-*) : transport;;
866 index-pack) : plumbing;;
867 init-db) : deprecated;;
868 local-fetch) : plumbing;;
869 lost-found) : infrequent;;
870 ls-files) : plumbing;;
871 ls-remote) : plumbing;;
872 ls-tree) : plumbing;;
873 mailinfo) : plumbing;;
874 mailsplit) : plumbing;;
875 merge-*) : plumbing;;
878 pack-objects) : plumbing;;
879 pack-redundant) : plumbing;;
880 pack-refs) : plumbing;;
881 parse-remote) : plumbing;;
882 patch-id) : plumbing;;
883 peek-remote) : plumbing;;
885 prune-packed) : plumbing;;
886 quiltimport) : import;;
887 read-tree) : plumbing;;
888 receive-pack) : plumbing;;
889 remote-*) : transport;;
890 repo-config) : deprecated;;
892 rev-list) : plumbing;;
893 rev-parse) : plumbing;;
894 runstatus) : plumbing;;
895 sh-setup) : internal;;
897 show-ref) : plumbing;;
898 send-pack) : plumbing;;
899 show-index) : plumbing;;
901 stripspace) : plumbing;;
902 symbolic-ref) : plumbing;;
903 tar-tree) : deprecated;;
904 unpack-file) : plumbing;;
905 unpack-objects) : plumbing;;
906 update-index) : plumbing;;
907 update-ref) : plumbing;;
908 update-server-info) : daemon;;
909 upload-archive) : plumbing;;
910 upload-pack) : plumbing;;
911 write-tree) : plumbing;;
913 verify-pack) : infrequent;;
914 verify-tag) : plumbing;;
920 __git_porcelain_commands=
921 __git_compute_porcelain_commands ()
923 __git_compute_all_commands
924 test -n "$__git_porcelain_commands" ||
925 __git_porcelain_commands=$(__git_list_porcelain_commands)
928 __git_pretty_aliases ()
931 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "pretty\..*" 2>/dev/null); do
944 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "alias\..*" 2>/dev/null); do
954 # __git_aliased_command requires 1 argument
955 __git_aliased_command ()
957 local word cmdline=$(git --git-dir="$(__gitdir)" \
958 config --get "alias.$1")
959 for word in $cmdline; do
965 \!*) : shell command alias ;;
967 *=*) : setting env ;;
976 # __git_find_on_cmdline requires 1 argument
977 __git_find_on_cmdline ()
979 local word subcommand c=1
980 while [ $c -lt $cword ]; do
982 for subcommand in $1; do
983 if [ "$subcommand" = "$word" ]; then
992 __git_has_doubledash ()
995 while [ $c -lt $cword ]; do
996 if [ "--" = "${words[c]}" ]; then
1004 __git_whitespacelist="nowarn warn error error-all fix"
1008 local dir="$(__gitdir)"
1009 if [ -d "$dir"/rebase-apply ]; then
1010 __gitcomp "--skip --continue --resolved --abort"
1015 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1020 --3way --committer-date-is-author-date --ignore-date
1021 --ignore-whitespace --ignore-space-change
1022 --interactive --keep --no-utf8 --signoff --utf8
1023 --whitespace= --scissors
1034 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1039 --stat --numstat --summary --check --index
1040 --cached --index-info --reverse --reject --unidiff-zero
1041 --apply --no-add --exclude=
1042 --ignore-whitespace --ignore-space-change
1043 --whitespace= --inaccurate-eof --verbose
1052 __git_has_doubledash && return
1057 --interactive --refresh --patch --update --dry-run
1058 --ignore-errors --intent-to-add
1069 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
1073 __gitcomp_nl "$(__git_remotes)" "" "${cur##--remote=}"
1078 --format= --list --verbose
1079 --prefix= --remote= --exec=
1089 __git_has_doubledash && return
1091 local subcommands="start bad good skip reset visualize replay log run"
1092 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1093 if [ -z "$subcommand" ]; then
1094 if [ -f "$(__gitdir)"/BISECT_START ]; then
1095 __gitcomp "$subcommands"
1097 __gitcomp "replay start"
1102 case "$subcommand" in
1103 bad|good|reset|skip|start)
1104 __gitcomp_nl "$(__git_refs)"
1114 local i c=1 only_local_ref="n" has_r="n"
1116 while [ $c -lt $cword ]; do
1119 -d|-m) only_local_ref="y" ;;
1128 --color --no-color --verbose --abbrev= --no-abbrev
1129 --track --no-track --contains --merged --no-merged
1130 --set-upstream --edit-description --list
1134 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
1135 __gitcomp_nl "$(__git_heads)"
1137 __gitcomp_nl "$(__git_refs)"
1145 local cmd="${words[2]}"
1148 __gitcomp "create list-heads verify unbundle"
1151 # looking for a file
1156 __git_complete_revlist
1165 __git_has_doubledash && return
1169 __gitcomp "diff3 merge" "" "${cur##--conflict=}"
1173 --quiet --ours --theirs --track --no-track --merge
1174 --conflict= --orphan --patch
1178 # check if --track, --no-track, or --no-guess was specified
1179 # if so, disable DWIM mode
1180 local flags="--track --no-track --no-guess" track=1
1181 if [ -n "$(__git_find_on_cmdline "$flags")" ]; then
1184 __gitcomp_nl "$(__git_refs '' $track)"
1191 __gitcomp "$(__git_refs)"
1198 __gitcomp "--edit --no-commit"
1201 __gitcomp_nl "$(__git_refs)"
1208 __git_has_doubledash && return
1212 __gitcomp "--dry-run --quiet"
1245 __git_has_doubledash && return
1249 __gitcomp "default strip verbatim whitespace
1250 " "" "${cur##--cleanup=}"
1253 --reuse-message=*|--reedit-message=*|\
1254 --fixup=*|--squash=*)
1255 __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1258 --untracked-files=*)
1259 __gitcomp "all no normal" "" "${cur##--untracked-files=}"
1264 --all --author= --signoff --verify --no-verify
1265 --edit --amend --include --only --interactive
1266 --dry-run --reuse-message= --reedit-message=
1267 --reset-author --file= --message= --template=
1268 --cleanup= --untracked-files --untracked-files=
1269 --verbose --quiet --fixup= --squash=
1281 --all --tags --contains --abbrev= --candidates=
1282 --exact-match --debug --long --match --always
1286 __gitcomp_nl "$(__git_refs)"
1289 __git_diff_common_options="--stat --numstat --shortstat --summary
1290 --patch-with-stat --name-only --name-status --color
1291 --no-color --color-words --no-renames --check
1292 --full-index --binary --abbrev --diff-filter=
1293 --find-copies-harder
1294 --text --ignore-space-at-eol --ignore-space-change
1295 --ignore-all-space --exit-code --quiet --ext-diff
1297 --no-prefix --src-prefix= --dst-prefix=
1298 --inter-hunk-context=
1301 --dirstat --dirstat= --dirstat-by-file
1302 --dirstat-by-file= --cumulative
1307 __git_has_doubledash && return
1311 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1312 --base --ours --theirs --no-index
1313 $__git_diff_common_options
1318 __git_complete_revlist_file
1321 __git_mergetools_common="diffuse ecmerge emerge kdiff3 meld opendiff
1322 tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc3
1327 __git_has_doubledash && return
1331 __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
1335 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1336 --base --ours --theirs
1337 --no-renames --diff-filter= --find-copies-harder
1338 --relative --ignore-submodules
1346 __git_fetch_options="
1347 --quiet --verbose --append --upload-pack --force --keep --depth=
1348 --tags --no-tags --all --prune --dry-run
1355 __gitcomp "$__git_fetch_options"
1359 __git_complete_remote_or_refspec
1362 _git_format_patch ()
1368 " "" "${cur##--thread=}"
1373 --stdout --attach --no-attach --thread --thread=
1375 --numbered --start-number
1378 --signoff --signature --no-signature
1379 --in-reply-to= --cc=
1380 --full-index --binary
1383 --no-prefix --src-prefix= --dst-prefix=
1384 --inline --suffix= --ignore-if-in-upstream
1390 __git_complete_revlist
1398 --tags --root --unreachable --cache --no-reflogs --full
1399 --strict --verbose --lost-found
1411 __gitcomp "--prune --aggressive"
1423 __git_match_ctag() {
1424 awk "/^${1////\\/}/ { print \$1 }" "$2"
1429 __git_has_doubledash && return
1435 --text --ignore-case --word-regexp --invert-match
1436 --full-name --line-number
1437 --extended-regexp --basic-regexp --fixed-strings
1439 --files-with-matches --name-only
1440 --files-without-match
1443 --and --or --not --all-match
1449 case "$cword,$prev" in
1451 if test -r tags; then
1452 __gitcomp_nl "$(__git_match_ctag "$cur" tags)"
1458 __gitcomp_nl "$(__git_refs)"
1465 __gitcomp "--all --info --man --web"
1469 __git_compute_all_commands
1470 __gitcomp "$__git_all_commands $(__git_aliases)
1471 attributes cli core-tutorial cvs-migration
1472 diffcore gitk glossary hooks ignore modules
1473 namespaces repository-layout tutorial tutorial-2
1483 false true umask group all world everybody
1484 " "" "${cur##--shared=}"
1488 __gitcomp "--quiet --bare --template= --shared --shared="
1497 __git_has_doubledash && return
1501 __gitcomp "--cached --deleted --modified --others --ignored
1502 --stage --directory --no-empty-directory --unmerged
1503 --killed --exclude= --exclude-from=
1504 --exclude-per-directory= --exclude-standard
1505 --error-unmatch --with-tree= --full-name
1506 --abbrev --ignored --exclude-per-directory
1516 __gitcomp_nl "$(__git_remotes)"
1524 # Options that go well for log, shortlog and gitk
1525 __git_log_common_options="
1527 --branches --tags --remotes
1528 --first-parent --merges --no-merges
1530 --max-age= --since= --after=
1531 --min-age= --until= --before=
1532 --min-parents= --max-parents=
1533 --no-min-parents --no-max-parents
1535 # Options that go well for log and gitk (not shortlog)
1536 __git_log_gitk_options="
1537 --dense --sparse --full-history
1538 --simplify-merges --simplify-by-decoration
1539 --left-right --notes --no-notes
1541 # Options that go well for log and shortlog (not gitk)
1542 __git_log_shortlog_options="
1543 --author= --committer= --grep=
1547 __git_log_pretty_formats="oneline short medium full fuller email raw format:"
1548 __git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1552 __git_has_doubledash && return
1554 local g="$(git rev-parse --git-dir 2>/dev/null)"
1556 if [ -f "$g/MERGE_HEAD" ]; then
1560 --pretty=*|--format=*)
1561 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
1566 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1570 __gitcomp "long short" "" "${cur##--decorate=}"
1575 $__git_log_common_options
1576 $__git_log_shortlog_options
1577 $__git_log_gitk_options
1578 --root --topo-order --date-order --reverse
1579 --follow --full-diff
1580 --abbrev-commit --abbrev=
1581 --relative-date --date=
1582 --pretty= --format= --oneline
1585 --decorate --decorate=
1587 --parents --children
1589 $__git_diff_common_options
1590 --pickaxe-all --pickaxe-regex
1595 __git_complete_revlist
1598 __git_merge_options="
1599 --no-commit --no-stat --log --no-log --squash --strategy
1600 --commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit
1605 __git_complete_strategy && return
1609 __gitcomp "$__git_merge_options"
1612 __gitcomp_nl "$(__git_refs)"
1619 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1632 __gitcomp_nl "$(__git_refs)"
1639 __gitcomp "--dry-run"
1648 __gitcomp "--tags --all --stdin"
1653 local subcommands='add append copy edit list prune remove show'
1654 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1656 case "$subcommand,$cur" in
1663 __gitcomp_nl "$(__git_refs)"
1666 __gitcomp "$subcommands --ref"
1670 add,--reuse-message=*|append,--reuse-message=*|\
1671 add,--reedit-message=*|append,--reedit-message=*)
1672 __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1675 __gitcomp '--file= --message= --reedit-message=
1682 __gitcomp '--dry-run --verbose'
1691 __gitcomp_nl "$(__git_refs)"
1700 __git_complete_strategy && return
1705 --rebase --no-rebase
1706 $__git_merge_options
1707 $__git_fetch_options
1712 __git_complete_remote_or_refspec
1719 __gitcomp_nl "$(__git_remotes)"
1724 __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}"
1729 --all --mirror --tags --dry-run --force --verbose
1730 --receive-pack= --repo= --set-upstream
1735 __git_complete_remote_or_refspec
1740 local dir="$(__gitdir)"
1741 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1742 __gitcomp "--continue --skip --abort"
1745 __git_complete_strategy && return
1748 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1753 --onto --merge --strategy --interactive
1754 --preserve-merges --stat --no-stat
1755 --committer-date-is-author-date --ignore-date
1756 --ignore-whitespace --whitespace=
1762 __gitcomp_nl "$(__git_refs)"
1767 local subcommands="show delete expire"
1768 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1770 if [ -z "$subcommand" ]; then
1771 __gitcomp "$subcommands"
1773 __gitcomp_nl "$(__git_refs)"
1777 __git_send_email_confirm_options="always never auto cc compose"
1778 __git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
1785 $__git_send_email_confirm_options
1786 " "" "${cur##--confirm=}"
1791 $__git_send_email_suppresscc_options
1792 " "" "${cur##--suppress-cc=}"
1796 --smtp-encryption=*)
1797 __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1801 __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1802 --compose --confirm= --dry-run --envelope-sender
1804 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1805 --no-suppress-from --no-thread --quiet
1806 --signed-off-by-cc --smtp-pass --smtp-server
1807 --smtp-server-port --smtp-encryption= --smtp-user
1808 --subject --suppress-cc= --suppress-from --thread --to
1809 --validate --no-validate"
1821 __git_config_get_set_variables ()
1823 local prevword word config_file= c=$cword
1824 while [ $c -gt 1 ]; do
1827 --global|--system|--file=*)
1832 config_file="$word $prevword"
1840 git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null |
1855 __gitcomp_nl "$(__git_remotes)"
1859 __gitcomp_nl "$(__git_refs)"
1863 local remote="${prev#remote.}"
1864 remote="${remote%.fetch}"
1865 if [ -z "$cur" ]; then
1866 COMPREPLY=("refs/heads/")
1869 __gitcomp_nl "$(__git_refs_remotes "$remote")"
1873 local remote="${prev#remote.}"
1874 remote="${remote%.push}"
1875 __gitcomp_nl "$(git --git-dir="$(__gitdir)" \
1876 for-each-ref --format='%(refname):%(refname)' \
1880 pull.twohead|pull.octopus)
1881 __git_compute_merge_strategies
1882 __gitcomp "$__git_merge_strategies"
1885 color.branch|color.diff|color.interactive|\
1886 color.showbranch|color.status|color.ui)
1887 __gitcomp "always never auto"
1891 __gitcomp "false true"
1896 normal black red green yellow blue magenta cyan white
1897 bold dim ul blink reverse
1902 __gitcomp "man info web html"
1906 __gitcomp "$__git_log_date_formats"
1909 sendemail.aliasesfiletype)
1910 __gitcomp "mutt mailrc pine elm gnus"
1914 __gitcomp "$__git_send_email_confirm_options"
1917 sendemail.suppresscc)
1918 __gitcomp "$__git_send_email_suppresscc_options"
1921 --get|--get-all|--unset|--unset-all)
1922 __gitcomp_nl "$(__git_config_get_set_variables)"
1933 --global --system --file=
1934 --list --replace-all
1935 --get --get-all --get-regexp
1936 --add --unset --unset-all
1937 --remove-section --rename-section
1942 local pfx="${cur%.*}." cur_="${cur##*.}"
1943 __gitcomp "remote merge mergeoptions rebase" "$pfx" "$cur_"
1947 local pfx="${cur%.*}." cur_="${cur#*.}"
1948 __gitcomp_nl "$(__git_heads)" "$pfx" "$cur_" "."
1952 local pfx="${cur%.*}." cur_="${cur##*.}"
1954 argprompt cmd confirm needsfile noconsole norescan
1955 prompt revprompt revunmerged title
1960 local pfx="${cur%.*}." cur_="${cur##*.}"
1961 __gitcomp "cmd path" "$pfx" "$cur_"
1965 local pfx="${cur%.*}." cur_="${cur##*.}"
1966 __gitcomp "cmd path" "$pfx" "$cur_"
1970 local pfx="${cur%.*}." cur_="${cur##*.}"
1971 __gitcomp "cmd path trustExitCode" "$pfx" "$cur_"
1975 local pfx="${cur%.*}." cur_="${cur#*.}"
1976 __git_compute_all_commands
1977 __gitcomp_nl "$__git_all_commands" "$pfx" "$cur_"
1981 local pfx="${cur%.*}." cur_="${cur##*.}"
1983 url proxy fetch push mirror skipDefaultUpdate
1984 receivepack uploadpack tagopt pushurl
1989 local pfx="${cur%.*}." cur_="${cur#*.}"
1990 __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
1994 local pfx="${cur%.*}." cur_="${cur##*.}"
1995 __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_"
2001 advice.commitBeforeMerge
2003 advice.implicitIdentity
2004 advice.pushNonFastForward
2005 advice.resolveConflict
2009 apply.ignorewhitespace
2011 branch.autosetupmerge
2012 branch.autosetuprebase
2016 color.branch.current
2021 color.decorate.branch
2022 color.decorate.remoteBranch
2023 color.decorate.stash
2033 color.diff.whitespace
2038 color.grep.linenumber
2041 color.grep.separator
2043 color.interactive.error
2044 color.interactive.header
2045 color.interactive.help
2046 color.interactive.prompt
2051 color.status.changed
2053 color.status.nobranch
2054 color.status.untracked
2055 color.status.updated
2064 core.bigFileThreshold
2067 core.deltaBaseCacheLimit
2072 core.fsyncobjectfiles
2074 core.ignoreCygwinFSTricks
2077 core.logAllRefUpdates
2078 core.loosecompression
2081 core.packedGitWindowSize
2083 core.preferSymlinkRefs
2086 core.repositoryFormatVersion
2088 core.sharedRepository
2092 core.warnAmbiguousRefs
2095 diff.autorefreshindex
2098 diff.ignoreSubmodules
2103 diff.suppressBlankEmpty
2108 fetch.recurseSubmodules
2117 format.subjectprefix
2128 gc.reflogexpireunreachable
2132 gitcvs.commitmsgannotation
2133 gitcvs.dbTableNamePrefix
2144 gui.copyblamethreshold
2148 gui.matchtrackingbranch
2149 gui.newbranchtemplate
2150 gui.pruneduringfetch
2151 gui.spellingdictionary
2166 http.sslCertPasswordProtected
2171 i18n.logOutputEncoding
2177 imap.preformattedHTML
2187 interactive.singlekey
2203 mergetool.keepBackup
2204 mergetool.keepTemporaries
2209 notes.rewrite.rebase
2213 pack.deltaCacheLimit
2229 receive.denyCurrentBranch
2230 receive.denyDeleteCurrent
2232 receive.denyNonFastForwards
2235 receive.updateserverinfo
2237 repack.usedeltabaseoffset
2241 sendemail.aliasesfile
2242 sendemail.aliasfiletype
2246 sendemail.chainreplyto
2248 sendemail.envelopesender
2252 sendemail.signedoffbycc
2253 sendemail.smtpdomain
2254 sendemail.smtpencryption
2256 sendemail.smtpserver
2257 sendemail.smtpserveroption
2258 sendemail.smtpserverport
2260 sendemail.suppresscc
2261 sendemail.suppressfrom
2266 status.relativePaths
2267 status.showUntrackedFiles
2268 status.submodulesummary
2271 transfer.unpackLimit
2283 local subcommands="add rename rm set-head set-branches set-url show prune update"
2284 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2285 if [ -z "$subcommand" ]; then
2286 __gitcomp "$subcommands"
2290 case "$subcommand" in
2291 rename|rm|set-url|show|prune)
2292 __gitcomp_nl "$(__git_remotes)"
2294 set-head|set-branches)
2295 __git_complete_remote_or_refspec
2298 local i c='' IFS=$'\n'
2299 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "remotes\..*" 2>/dev/null); do
2313 __gitcomp_nl "$(__git_refs)"
2318 __git_has_doubledash && return
2322 __gitcomp "--merge --mixed --hard --soft --patch"
2326 __gitcomp_nl "$(__git_refs)"
2333 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
2337 __gitcomp_nl "$(__git_refs)"
2342 __git_has_doubledash && return
2346 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
2355 __git_has_doubledash && return
2360 $__git_log_common_options
2361 $__git_log_shortlog_options
2362 --numbered --summary
2367 __git_complete_revlist
2372 __git_has_doubledash && return
2375 --pretty=*|--format=*)
2376 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
2381 __gitcomp "--pretty= --format= --abbrev-commit --oneline
2382 $__git_diff_common_options
2395 --all --remotes --topo-order --current --more=
2396 --list --independent --merge-base --no-name
2398 --sha1-name --sparse --topics --reflog
2403 __git_complete_revlist
2408 local save_opts='--keep-index --no-keep-index --quiet --patch'
2409 local subcommands='save list show apply clear drop pop create branch'
2410 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2411 if [ -z "$subcommand" ]; then
2414 __gitcomp "$save_opts"
2417 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2418 __gitcomp "$subcommands"
2425 case "$subcommand,$cur" in
2427 __gitcomp "$save_opts"
2430 __gitcomp "--index --quiet"
2432 show,--*|drop,--*|branch,--*)
2435 show,*|apply,*|drop,*|pop,*|branch,*)
2436 __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
2437 | sed -n -e 's/:.*//p')"
2448 __git_has_doubledash && return
2450 local subcommands="add status init update summary foreach sync"
2451 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2454 __gitcomp "--quiet --cached"
2457 __gitcomp "$subcommands"
2467 init fetch clone rebase dcommit log find-rev
2468 set-tree commit-diff info create-ignore propget
2469 proplist show-ignore show-externals branch tag blame
2470 migrate mkdirs reset gc
2472 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2473 if [ -z "$subcommand" ]; then
2474 __gitcomp "$subcommands"
2476 local remote_opts="--username= --config-dir= --no-auth-cache"
2478 --follow-parent --authors-file= --repack=
2479 --no-metadata --use-svm-props --use-svnsync-props
2480 --log-window-size= --no-checkout --quiet
2481 --repack-flags --use-log-author --localtime
2482 --ignore-paths= $remote_opts
2485 --template= --shared= --trunk= --tags=
2486 --branches= --stdlayout --minimize-url
2487 --no-metadata --use-svm-props --use-svnsync-props
2488 --rewrite-root= --prefix= --use-log-author
2489 --add-author-from $remote_opts
2492 --edit --rmdir --find-copies-harder --copy-similarity=
2495 case "$subcommand,$cur" in
2497 __gitcomp "--revision= --fetch-all $fc_opts"
2500 __gitcomp "--revision= $fc_opts $init_opts"
2503 __gitcomp "$init_opts"
2507 --merge --strategy= --verbose --dry-run
2508 --fetch-all --no-rebase --commit-url
2509 --revision --interactive $cmt_opts $fc_opts
2513 __gitcomp "--stdin $cmt_opts $fc_opts"
2515 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
2516 show-externals,--*|mkdirs,--*)
2517 __gitcomp "--revision="
2521 --limit= --revision= --verbose --incremental
2522 --oneline --show-commit --non-recursive
2523 --authors-file= --color
2528 --merge --verbose --strategy= --local
2529 --fetch-all --dry-run $fc_opts
2533 __gitcomp "--message= --file= --revision= $cmt_opts"
2539 __gitcomp "--dry-run --message --tag"
2542 __gitcomp "--dry-run --message"
2545 __gitcomp "--git-format"
2549 --config-dir= --ignore-paths= --minimize
2550 --no-auth-cache --username=
2554 __gitcomp "--revision= --parent"
2566 while [ $c -lt $cword ]; do
2570 __gitcomp_nl "$(__git_tags)"
2586 __gitcomp_nl "$(__git_tags)"
2592 __gitcomp_nl "$(__git_refs)"
2604 local i c=1 command __git_dir
2606 if [[ -n ${ZSH_VERSION-} ]]; then
2610 # workaround zsh's bug that leaves 'words' as a special
2611 # variable in versions < 4.3.12
2614 # workaround zsh's bug that quotes spaces in the COMPREPLY
2615 # array if IFS doesn't contain spaces.
2619 local cur words cword prev
2620 _get_comp_words_by_ref -n =: cur words cword prev
2621 while [ $c -lt $cword ]; do
2624 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2625 --bare) __git_dir="." ;;
2626 --version|-p|--paginate) ;;
2627 --help) command="help"; break ;;
2628 *) command="$i"; break ;;
2633 if [ -z "$command" ]; then
2646 --no-replace-objects
2650 *) __git_compute_porcelain_commands
2651 __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
2656 local completion_func="_git_${command//-/_}"
2657 declare -f $completion_func >/dev/null && $completion_func && return
2659 local expansion=$(__git_aliased_command "$command")
2660 if [ -n "$expansion" ]; then
2661 completion_func="_git_${expansion//-/_}"
2662 declare -f $completion_func >/dev/null && $completion_func
2668 if [[ -n ${ZSH_VERSION-} ]]; then
2672 # workaround zsh's bug that leaves 'words' as a special
2673 # variable in versions < 4.3.12
2676 # workaround zsh's bug that quotes spaces in the COMPREPLY
2677 # array if IFS doesn't contain spaces.
2681 local cur words cword prev
2682 _get_comp_words_by_ref -n =: cur words cword prev
2684 __git_has_doubledash && return
2686 local g="$(__gitdir)"
2688 if [ -f "$g/MERGE_HEAD" ]; then
2694 $__git_log_common_options
2695 $__git_log_gitk_options
2701 __git_complete_revlist
2704 complete -o bashdefault -o default -o nospace -F _git git 2>/dev/null \
2705 || complete -o default -o nospace -F _git git
2706 complete -o bashdefault -o default -o nospace -F _gitk gitk 2>/dev/null \
2707 || complete -o default -o nospace -F _gitk gitk
2709 # The following are necessary only for Cygwin, and only are needed
2710 # when the user has tab-completed the executable name and consequently
2711 # included the '.exe' suffix.
2713 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
2714 complete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \
2715 || complete -o default -o nospace -F _git git.exe