3 # bash 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) Added the following line to your .bashrc:
22 # source ~/.git-completion.sh
24 # 3) Consider changing your PS1 to also show the current branch:
25 # PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
27 # The argument to __git_ps1 will be displayed only if you
28 # are currently in a git repository. The %s token will be
29 # the name of the current branch.
31 # In addition, if you set GIT_PS1_SHOWDIRTYSTATE to a nonempty
32 # value, unstaged (*) and staged (+) changes will be shown next
33 # to the branch name. You can configure this per-repository
34 # with the bash.showDirtyState variable, which defaults to true
35 # once GIT_PS1_SHOWDIRTYSTATE is enabled.
37 # You can also see if currently something is stashed, by setting
38 # GIT_PS1_SHOWSTASHSTATE to a nonempty value. If something is stashed,
39 # then a '$' will be shown next to the branch name.
41 # If you would like to see if there're untracked files, then you can
42 # set GIT_PS1_SHOWUNTRACKEDFILES to a nonempty value. If there're
43 # untracked files, then a '%' will be shown next to the branch name.
45 # If you would like to see the difference between HEAD and its
46 # upstream, set GIT_PS1_SHOWUPSTREAM="auto". A "<" indicates
47 # you are behind, ">" indicates you are ahead, and "<>"
48 # indicates you have diverged. You can further control
49 # behaviour by setting GIT_PS1_SHOWUPSTREAM to a space-separated
51 # verbose show number of commits ahead/behind (+/-) upstream
52 # legacy don't use the '--count' option available in recent
53 # versions of git-rev-list
54 # git always compare HEAD to @{upstream}
55 # svn always compare HEAD to your SVN upstream
56 # By default, __git_ps1 will compare HEAD to your SVN upstream
57 # if it can find one, or @{upstream} otherwise. Once you have
58 # set GIT_PS1_SHOWUPSTREAM, you can override it on a
59 # per-repository basis by setting the bash.showUpstream config
65 # *) Read Documentation/SubmittingPatches
66 # *) Send all patches to the current maintainer:
68 # "Shawn O. Pearce" <spearce@spearce.org>
70 # *) Always CC the Git mailing list:
75 case "$COMP_WORDBREAKS" in
77 *) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
80 # __gitdir accepts 0 or 1 arguments (i.e., location)
81 # returns location of .git repo
84 if [ -z "${1-}" ]; then
85 if [ -n "${__git_dir-}" ]; then
87 elif [ -d .git ]; then
90 git rev-parse --git-dir 2>/dev/null
92 elif [ -d "$1/.git" ]; then
99 # stores the divergence from upstream in $p
100 # used by GIT_PS1_SHOWUPSTREAM
101 __git_ps1_show_upstream ()
104 local svn_remote=() svn_url_pattern count n
105 local upstream=git legacy="" verbose=""
107 # get some config options from git-config
108 while read key value; do
111 GIT_PS1_SHOWUPSTREAM="$value"
112 if [[ -z "${GIT_PS1_SHOWUPSTREAM}" ]]; then
118 svn_remote[ $((${#svn_remote[@]} + 1)) ]="$value"
119 svn_url_pattern+="\\|$value"
120 upstream=svn+git # default upstream is SVN if available, else git
123 done < <(git config -z --get-regexp '^(svn-remote\..*\.url|bash\.showupstream)$' 2>/dev/null | tr '\0\n' '\n ')
125 # parse configuration values
126 for option in ${GIT_PS1_SHOWUPSTREAM}; do
128 git|svn) upstream="$option" ;;
129 verbose) verbose=1 ;;
136 git) upstream="@{upstream}" ;;
138 # get the upstream from the "git-svn-id: ..." in a commit message
139 # (git-svn uses essentially the same procedure internally)
140 local svn_upstream=($(git log --first-parent -1 \
141 --grep="^git-svn-id: \(${svn_url_pattern:2}\)" 2>/dev/null))
142 if [[ 0 -ne ${#svn_upstream[@]} ]]; then
143 svn_upstream=${svn_upstream[ ${#svn_upstream[@]} - 2 ]}
144 svn_upstream=${svn_upstream%@*}
145 for ((n=1; "$n" <= "${#svn_remote[@]}"; ++n)); do
146 svn_upstream=${svn_upstream#${svn_remote[$n]}}
149 if [[ -z "$svn_upstream" ]]; then
150 # default branch name for checkouts with no layout:
151 upstream=${GIT_SVN_ID:-git-svn}
153 upstream=${svn_upstream#/}
155 elif [[ "svn+git" = "$upstream" ]]; then
156 upstream="@{upstream}"
161 # Find how many commits we are ahead/behind our upstream
162 if [[ -z "$legacy" ]]; then
163 count="$(git rev-list --count --left-right \
164 "$upstream"...HEAD 2>/dev/null)"
166 # produce equivalent output to --count for older versions of git
168 if commits="$(git rev-list --left-right "$upstream"...HEAD 2>/dev/null)"
170 local commit behind=0 ahead=0
171 for commit in $commits
180 count="$behind $ahead"
186 # calculate the result
187 if [[ -z "$verbose" ]]; then
191 "0 0") # equal to upstream
193 "0 "*) # ahead of upstream
195 *" 0") # behind upstream
197 *) # diverged from upstream
204 "0 0") # equal to upstream
206 "0 "*) # ahead of upstream
207 p=" u+${count#0 }" ;;
208 *" 0") # behind upstream
209 p=" u-${count% 0}" ;;
210 *) # diverged from upstream
211 p=" u+${count#* }-${count% *}" ;;
218 # __git_ps1 accepts 0 or 1 arguments (i.e., format string)
219 # returns text to add to bash PS1 prompt (includes branch name)
222 local g="$(__gitdir)"
226 if [ -f "$g/rebase-merge/interactive" ]; then
228 b="$(cat "$g/rebase-merge/head-name")"
229 elif [ -d "$g/rebase-merge" ]; then
231 b="$(cat "$g/rebase-merge/head-name")"
233 if [ -d "$g/rebase-apply" ]; then
234 if [ -f "$g/rebase-apply/rebasing" ]; then
236 elif [ -f "$g/rebase-apply/applying" ]; then
241 elif [ -f "$g/MERGE_HEAD" ]; then
243 elif [ -f "$g/BISECT_LOG" ]; then
247 b="$(git symbolic-ref HEAD 2>/dev/null)" || {
250 case "${GIT_PS1_DESCRIBE_STYLE-}" in
252 git describe --contains HEAD ;;
254 git describe --contains --all HEAD ;;
258 git describe --exact-match HEAD ;;
259 esac 2>/dev/null)" ||
261 b="$(cut -c1-7 "$g/HEAD" 2>/dev/null)..." ||
274 if [ "true" = "$(git rev-parse --is-inside-git-dir 2>/dev/null)" ]; then
275 if [ "true" = "$(git rev-parse --is-bare-repository 2>/dev/null)" ]; then
280 elif [ "true" = "$(git rev-parse --is-inside-work-tree 2>/dev/null)" ]; then
281 if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ]; then
282 if [ "$(git config --bool bash.showDirtyState)" != "false" ]; then
283 git diff --no-ext-diff --quiet --exit-code || w="*"
284 if git rev-parse --quiet --verify HEAD >/dev/null; then
285 git diff-index --cached --quiet HEAD -- || i="+"
291 if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ]; then
292 git rev-parse --verify refs/stash >/dev/null 2>&1 && s="$"
295 if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ]; then
296 if [ -n "$(git ls-files --others --exclude-standard)" ]; then
301 if [ -n "${GIT_PS1_SHOWUPSTREAM-}" ]; then
302 __git_ps1_show_upstream
307 printf "${1:- (%s)}" "$c${b##refs/heads/}${f:+ $f}$r$p"
311 # __gitcomp_1 requires 2 arguments
314 local c IFS=' '$'\t'$'\n'
317 --*=*) printf %s$'\n' "$c$2" ;;
318 *.) printf %s$'\n' "$c$2" ;;
319 *) printf %s$'\n' "$c$2 " ;;
324 # __gitcomp accepts 1, 2, 3, or 4 arguments
325 # generates completion reply with compgen
328 local cur="${COMP_WORDS[COMP_CWORD]}"
329 if [ $# -gt 2 ]; then
338 COMPREPLY=($(compgen -P "${2-}" \
339 -W "$(__gitcomp_1 "${1-}" "${4-}")" \
345 # __git_heads accepts 0 or 1 arguments (to pass to __gitdir)
348 local cmd i is_hash=y dir="$(__gitdir "${1-}")"
349 if [ -d "$dir" ]; then
350 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
354 for i in $(git ls-remote "${1-}" 2>/dev/null); do
355 case "$is_hash,$i" in
358 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
359 n,*) is_hash=y; echo "$i" ;;
364 # __git_tags accepts 0 or 1 arguments (to pass to __gitdir)
367 local cmd i is_hash=y dir="$(__gitdir "${1-}")"
368 if [ -d "$dir" ]; then
369 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
373 for i in $(git ls-remote "${1-}" 2>/dev/null); do
374 case "$is_hash,$i" in
377 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
378 n,*) is_hash=y; echo "$i" ;;
383 # __git_refs accepts 0 or 1 arguments (to pass to __gitdir)
386 local i is_hash=y dir="$(__gitdir "${1-}")"
387 local cur="${COMP_WORDS[COMP_CWORD]}" format refs
388 if [ -d "$dir" ]; then
395 for i in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD; do
396 if [ -e "$dir/$i" ]; then echo $i; fi
398 format="refname:short"
399 refs="refs/tags refs/heads refs/remotes"
402 git --git-dir="$dir" for-each-ref --format="%($format)" \
406 for i in $(git ls-remote "$dir" 2>/dev/null); do
407 case "$is_hash,$i" in
410 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
411 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
412 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
413 n,*) is_hash=y; echo "$i" ;;
418 # __git_refs2 requires 1 argument (to pass to __git_refs)
422 for i in $(__git_refs "$1"); do
427 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
428 __git_refs_remotes ()
430 local cmd i is_hash=y
431 for i in $(git ls-remote "$1" 2>/dev/null); do
432 case "$is_hash,$i" in
435 echo "$i:refs/remotes/$1/${i#refs/heads/}"
439 n,refs/tags/*) is_hash=y;;
447 local i ngoff IFS=$'\n' d="$(__gitdir)"
448 shopt -q nullglob || ngoff=1
450 for i in "$d/remotes"/*; do
451 echo ${i#$d/remotes/}
453 [ "$ngoff" ] && shopt -u nullglob
454 for i in $(git --git-dir="$d" config --get-regexp 'remote\..*\.url' 2>/dev/null); do
460 __git_list_merge_strategies ()
462 git merge -s help 2>&1 |
463 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
472 __git_merge_strategies=
473 # 'git merge -s help' (and thus detection of the merge strategy
474 # list) fails, unfortunately, if run outside of any git working
475 # tree. __git_merge_strategies is set to the empty string in
476 # that case, and the detection will be repeated the next time it
478 __git_compute_merge_strategies ()
480 : ${__git_merge_strategies:=$(__git_list_merge_strategies)}
483 __git_complete_file ()
485 local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
502 case "$COMP_WORDBREAKS" in
504 *) pfx="$ref:$pfx" ;;
508 COMPREPLY=($(compgen -P "$pfx" \
509 -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
510 | sed '/^100... blob /{
526 __gitcomp "$(__git_refs)"
531 __git_complete_revlist ()
533 local pfx cur="${COMP_WORDS[COMP_CWORD]}"
538 __gitcomp "$(__git_refs)" "$pfx" "$cur"
543 __gitcomp "$(__git_refs)" "$pfx" "$cur"
546 __gitcomp "$(__git_refs)"
551 __git_complete_remote_or_refspec ()
553 local cmd="${COMP_WORDS[1]}"
554 local cur="${COMP_WORDS[COMP_CWORD]}"
555 local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0
556 while [ $c -lt $COMP_CWORD ]; do
559 --mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
562 push) no_complete_refspec=1 ;;
571 *) remote="$i"; break ;;
575 if [ -z "$remote" ]; then
576 __gitcomp "$(__git_remotes)"
579 if [ $no_complete_refspec = 1 ]; then
583 [ "$remote" = "." ] && remote=
586 case "$COMP_WORDBREAKS" in
588 *) pfx="${cur%%:*}:" ;;
600 if [ $lhs = 1 ]; then
601 __gitcomp "$(__git_refs2 "$remote")" "$pfx" "$cur"
603 __gitcomp "$(__git_refs)" "$pfx" "$cur"
607 if [ $lhs = 1 ]; then
608 __gitcomp "$(__git_refs "$remote")" "$pfx" "$cur"
610 __gitcomp "$(__git_refs)" "$pfx" "$cur"
614 if [ $lhs = 1 ]; then
615 __gitcomp "$(__git_refs)" "$pfx" "$cur"
617 __gitcomp "$(__git_refs "$remote")" "$pfx" "$cur"
623 __git_complete_strategy ()
625 __git_compute_merge_strategies
626 case "${COMP_WORDS[COMP_CWORD-1]}" in
628 __gitcomp "$__git_merge_strategies"
631 local cur="${COMP_WORDS[COMP_CWORD]}"
634 __gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}"
641 __git_list_all_commands ()
644 for i in $(git help -a|egrep '^ [a-zA-Z0-9]')
647 *--*) : helper pattern;;
654 __git_compute_all_commands ()
656 : ${__git_all_commands:=$(__git_list_all_commands)}
659 __git_list_porcelain_commands ()
662 __git_compute_all_commands
663 for i in "help" $__git_all_commands
666 *--*) : helper pattern;;
667 applymbox) : ask gittus;;
668 applypatch) : ask gittus;;
669 archimport) : import;;
670 cat-file) : plumbing;;
671 check-attr) : plumbing;;
672 check-ref-format) : plumbing;;
673 checkout-index) : plumbing;;
674 commit-tree) : plumbing;;
675 count-objects) : infrequent;;
676 cvsexportcommit) : export;;
677 cvsimport) : import;;
678 cvsserver) : daemon;;
680 diff-files) : plumbing;;
681 diff-index) : plumbing;;
682 diff-tree) : plumbing;;
683 fast-import) : import;;
684 fast-export) : export;;
685 fsck-objects) : plumbing;;
686 fetch-pack) : plumbing;;
687 fmt-merge-msg) : plumbing;;
688 for-each-ref) : plumbing;;
689 hash-object) : plumbing;;
690 http-*) : transport;;
691 index-pack) : plumbing;;
692 init-db) : deprecated;;
693 local-fetch) : plumbing;;
694 lost-found) : infrequent;;
695 ls-files) : plumbing;;
696 ls-remote) : plumbing;;
697 ls-tree) : plumbing;;
698 mailinfo) : plumbing;;
699 mailsplit) : plumbing;;
700 merge-*) : plumbing;;
703 pack-objects) : plumbing;;
704 pack-redundant) : plumbing;;
705 pack-refs) : plumbing;;
706 parse-remote) : plumbing;;
707 patch-id) : plumbing;;
708 peek-remote) : plumbing;;
710 prune-packed) : plumbing;;
711 quiltimport) : import;;
712 read-tree) : plumbing;;
713 receive-pack) : plumbing;;
715 remote-*) : transport;;
716 repo-config) : deprecated;;
718 rev-list) : plumbing;;
719 rev-parse) : plumbing;;
720 runstatus) : plumbing;;
721 sh-setup) : internal;;
723 show-ref) : plumbing;;
724 send-pack) : plumbing;;
725 show-index) : plumbing;;
727 stripspace) : plumbing;;
728 symbolic-ref) : plumbing;;
729 tar-tree) : deprecated;;
730 unpack-file) : plumbing;;
731 unpack-objects) : plumbing;;
732 update-index) : plumbing;;
733 update-ref) : plumbing;;
734 update-server-info) : daemon;;
735 upload-archive) : plumbing;;
736 upload-pack) : plumbing;;
737 write-tree) : plumbing;;
739 verify-pack) : infrequent;;
740 verify-tag) : plumbing;;
746 __git_porcelain_commands=
747 __git_compute_porcelain_commands ()
749 __git_compute_all_commands
750 : ${__git_porcelain_commands:=$(__git_list_porcelain_commands)}
756 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "alias\..*" 2>/dev/null); do
766 # __git_aliased_command requires 1 argument
767 __git_aliased_command ()
769 local word cmdline=$(git --git-dir="$(__gitdir)" \
770 config --get "alias.$1")
771 for word in $cmdline; do
777 \!*) : shell command alias ;;
779 *=*) : setting env ;;
788 # __git_find_on_cmdline requires 1 argument
789 __git_find_on_cmdline ()
791 local word subcommand c=1
793 while [ $c -lt $COMP_CWORD ]; do
794 word="${COMP_WORDS[c]}"
795 for subcommand in $1; do
796 if [ "$subcommand" = "$word" ]; then
805 __git_has_doubledash ()
808 while [ $c -lt $COMP_CWORD ]; do
809 if [ "--" = "${COMP_WORDS[c]}" ]; then
817 __git_whitespacelist="nowarn warn error error-all fix"
821 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
822 if [ -d "$dir"/rebase-apply ]; then
823 __gitcomp "--skip --continue --resolved --abort"
828 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
833 --3way --committer-date-is-author-date --ignore-date
834 --ignore-whitespace --ignore-space-change
835 --interactive --keep --no-utf8 --signoff --utf8
836 --whitespace= --scissors
845 local cur="${COMP_WORDS[COMP_CWORD]}"
848 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
853 --stat --numstat --summary --check --index
854 --cached --index-info --reverse --reject --unidiff-zero
855 --apply --no-add --exclude=
856 --ignore-whitespace --ignore-space-change
857 --whitespace= --inaccurate-eof --verbose
866 __git_has_doubledash && return
868 local cur="${COMP_WORDS[COMP_CWORD]}"
872 --interactive --refresh --patch --update --dry-run
873 --ignore-errors --intent-to-add
882 local cur="${COMP_WORDS[COMP_CWORD]}"
885 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
889 __gitcomp "$(__git_remotes)" "" "${cur##--remote=}"
894 --format= --list --verbose
895 --prefix= --remote= --exec=
905 __git_has_doubledash && return
907 local subcommands="start bad good skip reset visualize replay log run"
908 local subcommand="$(__git_find_on_cmdline "$subcommands")"
909 if [ -z "$subcommand" ]; then
910 if [ -f "$(__gitdir)"/BISECT_START ]; then
911 __gitcomp "$subcommands"
913 __gitcomp "replay start"
918 case "$subcommand" in
919 bad|good|reset|skip|start)
920 __gitcomp "$(__git_refs)"
930 local i c=1 only_local_ref="n" has_r="n"
932 while [ $c -lt $COMP_CWORD ]; do
935 -d|-m) only_local_ref="y" ;;
941 case "${COMP_WORDS[COMP_CWORD]}" in
944 --color --no-color --verbose --abbrev= --no-abbrev
945 --track --no-track --contains --merged --no-merged
950 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
951 __gitcomp "$(__git_heads)"
953 __gitcomp "$(__git_refs)"
961 local cmd="${COMP_WORDS[2]}"
962 case "$COMP_CWORD" in
964 __gitcomp "create list-heads verify unbundle"
972 __git_complete_revlist
981 __git_has_doubledash && return
983 local cur="${COMP_WORDS[COMP_CWORD]}"
986 __gitcomp "diff3 merge" "" "${cur##--conflict=}"
990 --quiet --ours --theirs --track --no-track --merge
991 --conflict= --orphan --patch
995 __gitcomp "$(__git_refs)"
1002 __gitcomp "$(__git_refs)"
1007 local cur="${COMP_WORDS[COMP_CWORD]}"
1010 __gitcomp "--edit --no-commit"
1013 __gitcomp "$(__git_refs)"
1020 __git_has_doubledash && return
1022 local cur="${COMP_WORDS[COMP_CWORD]}"
1025 __gitcomp "--dry-run --quiet"
1034 local cur="${COMP_WORDS[COMP_CWORD]}"
1059 __git_has_doubledash && return
1061 local cur="${COMP_WORDS[COMP_CWORD]}"
1064 __gitcomp "default strip verbatim whitespace
1065 " "" "${cur##--cleanup=}"
1069 __gitcomp "$(__git_refs)" "" "${cur##--reuse-message=}"
1073 __gitcomp "$(__git_refs)" "" "${cur##--reedit-message=}"
1076 --untracked-files=*)
1077 __gitcomp "all no normal" "" "${cur##--untracked-files=}"
1082 --all --author= --signoff --verify --no-verify
1083 --edit --amend --include --only --interactive
1084 --dry-run --reuse-message= --reedit-message=
1085 --reset-author --file= --message= --template=
1086 --cleanup= --untracked-files --untracked-files=
1096 local cur="${COMP_WORDS[COMP_CWORD]}"
1100 --all --tags --contains --abbrev= --candidates=
1101 --exact-match --debug --long --match --always
1105 __gitcomp "$(__git_refs)"
1108 __git_diff_common_options="--stat --numstat --shortstat --summary
1109 --patch-with-stat --name-only --name-status --color
1110 --no-color --color-words --no-renames --check
1111 --full-index --binary --abbrev --diff-filter=
1112 --find-copies-harder
1113 --text --ignore-space-at-eol --ignore-space-change
1114 --ignore-all-space --exit-code --quiet --ext-diff
1116 --no-prefix --src-prefix= --dst-prefix=
1117 --inter-hunk-context=
1120 --dirstat --dirstat= --dirstat-by-file
1121 --dirstat-by-file= --cumulative
1126 __git_has_doubledash && return
1128 local cur="${COMP_WORDS[COMP_CWORD]}"
1131 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1132 --base --ours --theirs --no-index
1133 $__git_diff_common_options
1141 __git_mergetools_common="diffuse ecmerge emerge kdiff3 meld opendiff
1142 tkdiff vimdiff gvimdiff xxdiff araxis p4merge
1147 __git_has_doubledash && return
1149 local cur="${COMP_WORDS[COMP_CWORD]}"
1152 __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
1156 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1157 --base --ours --theirs
1158 --no-renames --diff-filter= --find-copies-harder
1159 --relative --ignore-submodules
1167 __git_fetch_options="
1168 --quiet --verbose --append --upload-pack --force --keep --depth=
1169 --tags --no-tags --all --prune --dry-run
1174 local cur="${COMP_WORDS[COMP_CWORD]}"
1177 __gitcomp "$__git_fetch_options"
1181 __git_complete_remote_or_refspec
1184 _git_format_patch ()
1186 local cur="${COMP_WORDS[COMP_CWORD]}"
1191 " "" "${cur##--thread=}"
1196 --stdout --attach --no-attach --thread --thread=
1198 --numbered --start-number
1201 --signoff --signature --no-signature
1202 --in-reply-to= --cc=
1203 --full-index --binary
1206 --no-prefix --src-prefix= --dst-prefix=
1207 --inline --suffix= --ignore-if-in-upstream
1213 __git_complete_revlist
1218 local cur="${COMP_WORDS[COMP_CWORD]}"
1222 --tags --root --unreachable --cache --no-reflogs --full
1223 --strict --verbose --lost-found
1233 local cur="${COMP_WORDS[COMP_CWORD]}"
1236 __gitcomp "--prune --aggressive"
1250 __git_has_doubledash && return
1252 local cur="${COMP_WORDS[COMP_CWORD]}"
1257 --text --ignore-case --word-regexp --invert-match
1259 --extended-regexp --basic-regexp --fixed-strings
1260 --files-with-matches --name-only
1261 --files-without-match
1264 --and --or --not --all-match
1270 __gitcomp "$(__git_refs)"
1275 local cur="${COMP_WORDS[COMP_CWORD]}"
1278 __gitcomp "--all --info --man --web"
1282 __git_compute_all_commands
1283 __gitcomp "$__git_all_commands
1284 attributes cli core-tutorial cvs-migration
1285 diffcore gitk glossary hooks ignore modules
1286 repository-layout tutorial tutorial-2
1293 local cur="${COMP_WORDS[COMP_CWORD]}"
1297 false true umask group all world everybody
1298 " "" "${cur##--shared=}"
1302 __gitcomp "--quiet --bare --template= --shared --shared="
1311 __git_has_doubledash && return
1313 local cur="${COMP_WORDS[COMP_CWORD]}"
1316 __gitcomp "--cached --deleted --modified --others --ignored
1317 --stage --directory --no-empty-directory --unmerged
1318 --killed --exclude= --exclude-from=
1319 --exclude-per-directory= --exclude-standard
1320 --error-unmatch --with-tree= --full-name
1321 --abbrev --ignored --exclude-per-directory
1331 __gitcomp "$(__git_remotes)"
1339 # Options that go well for log, shortlog and gitk
1340 __git_log_common_options="
1342 --branches --tags --remotes
1343 --first-parent --merges --no-merges
1345 --max-age= --since= --after=
1346 --min-age= --until= --before=
1348 # Options that go well for log and gitk (not shortlog)
1349 __git_log_gitk_options="
1350 --dense --sparse --full-history
1351 --simplify-merges --simplify-by-decoration
1354 # Options that go well for log and shortlog (not gitk)
1355 __git_log_shortlog_options="
1356 --author= --committer= --grep=
1360 __git_log_pretty_formats="oneline short medium full fuller email raw format:"
1361 __git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1365 __git_has_doubledash && return
1367 local cur="${COMP_WORDS[COMP_CWORD]}"
1368 local g="$(git rev-parse --git-dir 2>/dev/null)"
1370 if [ -f "$g/MERGE_HEAD" ]; then
1375 __gitcomp "$__git_log_pretty_formats
1376 " "" "${cur##--pretty=}"
1380 __gitcomp "$__git_log_pretty_formats
1381 " "" "${cur##--format=}"
1385 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1389 __gitcomp "long short" "" "${cur##--decorate=}"
1394 $__git_log_common_options
1395 $__git_log_shortlog_options
1396 $__git_log_gitk_options
1397 --root --topo-order --date-order --reverse
1398 --follow --full-diff
1399 --abbrev-commit --abbrev=
1400 --relative-date --date=
1401 --pretty= --format= --oneline
1404 --decorate --decorate=
1406 --parents --children
1408 $__git_diff_common_options
1409 --pickaxe-all --pickaxe-regex
1414 __git_complete_revlist
1417 __git_merge_options="
1418 --no-commit --no-stat --log --no-log --squash --strategy
1419 --commit --stat --no-squash --ff --no-ff --ff-only
1424 __git_complete_strategy && return
1426 local cur="${COMP_WORDS[COMP_CWORD]}"
1429 __gitcomp "$__git_merge_options"
1432 __gitcomp "$(__git_refs)"
1437 local cur="${COMP_WORDS[COMP_CWORD]}"
1440 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1453 __gitcomp "$(__git_refs)"
1458 local cur="${COMP_WORDS[COMP_CWORD]}"
1461 __gitcomp "--dry-run"
1470 __gitcomp "--tags --all --stdin"
1475 local subcommands="edit show"
1476 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
1477 __gitcomp "$subcommands"
1481 case "${COMP_WORDS[COMP_CWORD-1]}" in
1486 __gitcomp "$(__git_refs)"
1493 __git_complete_strategy && return
1495 local cur="${COMP_WORDS[COMP_CWORD]}"
1499 --rebase --no-rebase
1500 $__git_merge_options
1501 $__git_fetch_options
1506 __git_complete_remote_or_refspec
1511 local cur="${COMP_WORDS[COMP_CWORD]}"
1512 case "${COMP_WORDS[COMP_CWORD-1]}" in
1514 __gitcomp "$(__git_remotes)"
1519 __gitcomp "$(__git_remotes)" "" "${cur##--repo=}"
1524 --all --mirror --tags --dry-run --force --verbose
1525 --receive-pack= --repo=
1530 __git_complete_remote_or_refspec
1535 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
1536 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1537 __gitcomp "--continue --skip --abort"
1540 __git_complete_strategy && return
1543 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1548 --onto --merge --strategy --interactive
1549 --preserve-merges --stat --no-stat
1550 --committer-date-is-author-date --ignore-date
1551 --ignore-whitespace --whitespace=
1557 __gitcomp "$(__git_refs)"
1560 __git_send_email_confirm_options="always never auto cc compose"
1561 __git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
1565 local cur="${COMP_WORDS[COMP_CWORD]}"
1569 $__git_send_email_confirm_options
1570 " "" "${cur##--confirm=}"
1575 $__git_send_email_suppresscc_options
1576 " "" "${cur##--suppress-cc=}"
1580 --smtp-encryption=*)
1581 __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1585 __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1586 --compose --confirm= --dry-run --envelope-sender
1588 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1589 --no-suppress-from --no-thread --quiet
1590 --signed-off-by-cc --smtp-pass --smtp-server
1591 --smtp-server-port --smtp-encryption= --smtp-user
1592 --subject --suppress-cc= --suppress-from --thread --to
1593 --validate --no-validate"
1605 __git_config_get_set_variables ()
1607 local prevword word config_file= c=$COMP_CWORD
1608 while [ $c -gt 1 ]; do
1609 word="${COMP_WORDS[c]}"
1611 --global|--system|--file=*)
1616 config_file="$word $prevword"
1624 git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null |
1637 local cur="${COMP_WORDS[COMP_CWORD]}"
1638 local prv="${COMP_WORDS[COMP_CWORD-1]}"
1641 __gitcomp "$(__git_remotes)"
1645 __gitcomp "$(__git_refs)"
1649 local remote="${prv#remote.}"
1650 remote="${remote%.fetch}"
1651 __gitcomp "$(__git_refs_remotes "$remote")"
1655 local remote="${prv#remote.}"
1656 remote="${remote%.push}"
1657 __gitcomp "$(git --git-dir="$(__gitdir)" \
1658 for-each-ref --format='%(refname):%(refname)' \
1662 pull.twohead|pull.octopus)
1663 __git_compute_merge_strategies
1664 __gitcomp "$__git_merge_strategies"
1667 color.branch|color.diff|color.interactive|\
1668 color.showbranch|color.status|color.ui)
1669 __gitcomp "always never auto"
1673 __gitcomp "false true"
1678 normal black red green yellow blue magenta cyan white
1679 bold dim ul blink reverse
1684 __gitcomp "man info web html"
1688 __gitcomp "$__git_log_date_formats"
1691 sendemail.aliasesfiletype)
1692 __gitcomp "mutt mailrc pine elm gnus"
1696 __gitcomp "$__git_send_email_confirm_options"
1699 sendemail.suppresscc)
1700 __gitcomp "$__git_send_email_suppresscc_options"
1703 --get|--get-all|--unset|--unset-all)
1704 __gitcomp "$(__git_config_get_set_variables)"
1715 --global --system --file=
1716 --list --replace-all
1717 --get --get-all --get-regexp
1718 --add --unset --unset-all
1719 --remove-section --rename-section
1724 local pfx="${cur%.*}."
1726 __gitcomp "remote merge mergeoptions rebase" "$pfx" "$cur"
1730 local pfx="${cur%.*}."
1732 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1736 local pfx="${cur%.*}."
1739 argprompt cmd confirm needsfile noconsole norescan
1740 prompt revprompt revunmerged title
1745 local pfx="${cur%.*}."
1747 __gitcomp "cmd path" "$pfx" "$cur"
1751 local pfx="${cur%.*}."
1753 __gitcomp "cmd path" "$pfx" "$cur"
1757 local pfx="${cur%.*}."
1759 __gitcomp "cmd path trustExitCode" "$pfx" "$cur"
1763 local pfx="${cur%.*}."
1765 __git_compute_all_commands
1766 __gitcomp "$__git_all_commands" "$pfx" "$cur"
1770 local pfx="${cur%.*}."
1773 url proxy fetch push mirror skipDefaultUpdate
1774 receivepack uploadpack tagopt pushurl
1779 local pfx="${cur%.*}."
1781 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1785 local pfx="${cur%.*}."
1787 __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur"
1794 apply.ignorewhitespace
1796 branch.autosetupmerge
1797 branch.autosetuprebase
1800 color.branch.current
1811 color.diff.whitespace
1816 color.interactive.header
1817 color.interactive.help
1818 color.interactive.prompt
1823 color.status.changed
1825 color.status.nobranch
1826 color.status.untracked
1827 color.status.updated
1834 core.deltaBaseCacheLimit
1838 core.fsyncobjectfiles
1840 core.ignoreCygwinFSTricks
1842 core.logAllRefUpdates
1843 core.loosecompression
1845 core.packedGitWindowSize
1847 core.preferSymlinkRefs
1850 core.repositoryFormatVersion
1852 core.sharedRepository
1855 core.warnAmbiguousRefs
1858 diff.autorefreshindex
1864 diff.suppressBlankEmpty
1877 format.subjectprefix
1886 gc.reflogexpireunreachable
1890 gitcvs.commitmsgannotation
1891 gitcvs.dbTableNamePrefix
1902 gui.copyblamethreshold
1906 gui.matchtrackingbranch
1907 gui.newbranchtemplate
1908 gui.pruneduringfetch
1909 gui.spellingdictionary
1925 i18n.logOutputEncoding
1930 imap.preformattedHTML
1939 interactive.singlekey
1952 mergetool.keepBackup
1955 pack.deltaCacheLimit
1968 receive.denyCurrentBranch
1970 receive.denyNonFastForwards
1973 repack.usedeltabaseoffset
1976 sendemail.aliasesfile
1977 sendemail.aliasesfiletype
1981 sendemail.chainreplyto
1983 sendemail.envelopesender
1985 sendemail.signedoffbycc
1986 sendemail.smtpencryption
1988 sendemail.smtpserver
1989 sendemail.smtpserverport
1991 sendemail.suppresscc
1992 sendemail.suppressfrom
1997 status.relativePaths
1998 status.showUntrackedFiles
2000 transfer.unpackLimit
2012 local subcommands="add rename rm show prune update set-head"
2013 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2014 if [ -z "$subcommand" ]; then
2015 __gitcomp "$subcommands"
2019 case "$subcommand" in
2020 rename|rm|show|prune)
2021 __gitcomp "$(__git_remotes)"
2024 local i c='' IFS=$'\n'
2025 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "remotes\..*" 2>/dev/null); do
2039 __gitcomp "$(__git_refs)"
2044 __git_has_doubledash && return
2046 local cur="${COMP_WORDS[COMP_CWORD]}"
2049 __gitcomp "--merge --mixed --hard --soft --patch"
2053 __gitcomp "$(__git_refs)"
2058 local cur="${COMP_WORDS[COMP_CWORD]}"
2061 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
2065 __gitcomp "$(__git_refs)"
2070 __git_has_doubledash && return
2072 local cur="${COMP_WORDS[COMP_CWORD]}"
2075 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
2084 __git_has_doubledash && return
2086 local cur="${COMP_WORDS[COMP_CWORD]}"
2090 $__git_log_common_options
2091 $__git_log_shortlog_options
2092 --numbered --summary
2097 __git_complete_revlist
2102 __git_has_doubledash && return
2104 local cur="${COMP_WORDS[COMP_CWORD]}"
2107 __gitcomp "$__git_log_pretty_formats
2108 " "" "${cur##--pretty=}"
2112 __gitcomp "$__git_log_pretty_formats
2113 " "" "${cur##--format=}"
2117 __gitcomp "--pretty= --format= --abbrev-commit --oneline
2118 $__git_diff_common_options
2128 local cur="${COMP_WORDS[COMP_CWORD]}"
2132 --all --remotes --topo-order --current --more=
2133 --list --independent --merge-base --no-name
2135 --sha1-name --sparse --topics --reflog
2140 __git_complete_revlist
2145 local cur="${COMP_WORDS[COMP_CWORD]}"
2146 local save_opts='--keep-index --no-keep-index --quiet --patch'
2147 local subcommands='save list show apply clear drop pop create branch'
2148 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2149 if [ -z "$subcommand" ]; then
2152 __gitcomp "$save_opts"
2155 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2156 __gitcomp "$subcommands"
2163 case "$subcommand,$cur" in
2165 __gitcomp "$save_opts"
2168 __gitcomp "--index --quiet"
2170 show,--*|drop,--*|branch,--*)
2173 show,*|apply,*|drop,*|pop,*|branch,*)
2174 __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
2175 | sed -n -e 's/:.*//p')"
2186 __git_has_doubledash && return
2188 local subcommands="add status init update summary foreach sync"
2189 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2190 local cur="${COMP_WORDS[COMP_CWORD]}"
2193 __gitcomp "--quiet --cached"
2196 __gitcomp "$subcommands"
2206 init fetch clone rebase dcommit log find-rev
2207 set-tree commit-diff info create-ignore propget
2208 proplist show-ignore show-externals branch tag blame
2209 migrate mkdirs reset gc
2211 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2212 if [ -z "$subcommand" ]; then
2213 __gitcomp "$subcommands"
2215 local remote_opts="--username= --config-dir= --no-auth-cache"
2217 --follow-parent --authors-file= --repack=
2218 --no-metadata --use-svm-props --use-svnsync-props
2219 --log-window-size= --no-checkout --quiet
2220 --repack-flags --use-log-author --localtime
2221 --ignore-paths= $remote_opts
2224 --template= --shared= --trunk= --tags=
2225 --branches= --stdlayout --minimize-url
2226 --no-metadata --use-svm-props --use-svnsync-props
2227 --rewrite-root= --prefix= --use-log-author
2228 --add-author-from $remote_opts
2231 --edit --rmdir --find-copies-harder --copy-similarity=
2234 local cur="${COMP_WORDS[COMP_CWORD]}"
2235 case "$subcommand,$cur" in
2237 __gitcomp "--revision= --fetch-all $fc_opts"
2240 __gitcomp "--revision= $fc_opts $init_opts"
2243 __gitcomp "$init_opts"
2247 --merge --strategy= --verbose --dry-run
2248 --fetch-all --no-rebase --commit-url
2249 --revision $cmt_opts $fc_opts
2253 __gitcomp "--stdin $cmt_opts $fc_opts"
2255 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
2256 show-externals,--*|mkdirs,--*)
2257 __gitcomp "--revision="
2261 --limit= --revision= --verbose --incremental
2262 --oneline --show-commit --non-recursive
2263 --authors-file= --color
2268 --merge --verbose --strategy= --local
2269 --fetch-all --dry-run $fc_opts
2273 __gitcomp "--message= --file= --revision= $cmt_opts"
2279 __gitcomp "--dry-run --message --tag"
2282 __gitcomp "--dry-run --message"
2285 __gitcomp "--git-format"
2289 --config-dir= --ignore-paths= --minimize
2290 --no-auth-cache --username=
2294 __gitcomp "--revision= --parent"
2306 while [ $c -lt $COMP_CWORD ]; do
2307 i="${COMP_WORDS[c]}"
2310 __gitcomp "$(__git_tags)"
2320 case "${COMP_WORDS[COMP_CWORD-1]}" in
2326 __gitcomp "$(__git_tags)"
2332 __gitcomp "$(__git_refs)"
2344 local i c=1 command __git_dir
2346 while [ $c -lt $COMP_CWORD ]; do
2347 i="${COMP_WORDS[c]}"
2349 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2350 --bare) __git_dir="." ;;
2351 --version|-p|--paginate) ;;
2352 --help) command="help"; break ;;
2353 *) command="$i"; break ;;
2358 if [ -z "$command" ]; then
2359 case "${COMP_WORDS[COMP_CWORD]}" in
2372 *) __git_compute_porcelain_commands
2373 __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
2378 local completion_func="_git_${command//-/_}"
2379 declare -F $completion_func >/dev/null && $completion_func && return
2381 local expansion=$(__git_aliased_command "$command")
2382 if [ -n "$expansion" ]; then
2383 completion_func="_git_${expansion//-/_}"
2384 declare -F $completion_func >/dev/null && $completion_func
2390 __git_has_doubledash && return
2392 local cur="${COMP_WORDS[COMP_CWORD]}"
2393 local g="$(__gitdir)"
2395 if [ -f "$g/MERGE_HEAD" ]; then
2401 $__git_log_common_options
2402 $__git_log_gitk_options
2408 __git_complete_revlist
2411 complete -o bashdefault -o default -o nospace -F _git git 2>/dev/null \
2412 || complete -o default -o nospace -F _git git
2413 complete -o bashdefault -o default -o nospace -F _gitk gitk 2>/dev/null \
2414 || complete -o default -o nospace -F _gitk gitk
2416 # The following are necessary only for Cygwin, and only are needed
2417 # when the user has tab-completed the executable name and consequently
2418 # included the '.exe' suffix.
2420 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
2421 complete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \
2422 || complete -o default -o nospace -F _git git.exe