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.
47 # *) Read Documentation/SubmittingPatches
48 # *) Send all patches to the current maintainer:
50 # "Shawn O. Pearce" <spearce@spearce.org>
52 # *) Always CC the Git mailing list:
57 case "$COMP_WORDBREAKS" in
59 *) COMP_WORDBREAKS
="$COMP_WORDBREAKS:"
62 # __gitdir accepts 0 or 1 arguments (i.e., location)
63 # returns location of .git repo
66 if [ -z "${1-}" ]; then
67 if [ -n "${__git_dir-}" ]; then
69 elif [ -d .git
]; then
72 git rev-parse
--git-dir 2>/dev
/null
74 elif [ -d "$1/.git" ]; then
81 # __git_ps1 accepts 0 or 1 arguments (i.e., format string)
82 # returns text to add to bash PS1 prompt (includes branch name)
89 if [ -f "$g/rebase-merge/interactive" ]; then
91 b
="$(cat "$g/rebase-merge
/head-name
")"
92 elif [ -d "$g/rebase-merge" ]; then
94 b
="$(cat "$g/rebase-merge
/head-name
")"
96 if [ -d "$g/rebase-apply" ]; then
97 if [ -f "$g/rebase-apply/rebasing" ]; then
99 elif [ -f "$g/rebase-apply/applying" ]; then
104 elif [ -f "$g/MERGE_HEAD" ]; then
106 elif [ -f "$g/BISECT_LOG" ]; then
110 b
="$(git symbolic-ref HEAD 2>/dev/null)" ||
{
113 case "${GIT_PS1_DESCRIBE_STYLE-}" in
115 git describe --contains HEAD ;;
117 git describe --contains --all HEAD ;;
121 git describe --exact-match HEAD ;;
122 esac 2>/dev/null)" ||
124 b
="$(cut -c1-7 "$g/HEAD
" 2>/dev/null)..." ||
136 if [ "true" = "$(git rev-parse --is-inside-git-dir 2>/dev/null)" ]; then
137 if [ "true" = "$(git rev-parse --is-bare-repository 2>/dev/null)" ]; then
142 elif [ "true" = "$(git rev-parse --is-inside-work-tree 2>/dev/null)" ]; then
143 if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ]; then
144 if [ "$(git config --bool bash.showDirtyState)" != "false" ]; then
145 git
diff --no-ext-diff --quiet --exit-code || w
="*"
146 if git rev-parse
--quiet --verify HEAD
>/dev
/null
; then
147 git diff-index
--cached --quiet HEAD
-- || i
="+"
153 if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ]; then
154 git rev-parse
--verify refs
/stash
>/dev
/null
2>&1 && s
="$"
157 if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ]; then
158 if [ -n "$(git ls-files --others --exclude-standard)" ]; then
165 printf "${1:- (%s)}" "$c${b##refs/heads/}${f:+ $f}$r"
169 # __gitcomp_1 requires 2 arguments
172 local c IFS
=' '$
'\t'$
'\n'
175 --*=*) printf %s$
'\n' "$c$2" ;;
176 *.
) printf %s$
'\n' "$c$2" ;;
177 *) printf %s$
'\n' "$c$2 " ;;
182 # __gitcomp accepts 1, 2, 3, or 4 arguments
183 # generates completion reply with compgen
186 local cur
="${COMP_WORDS[COMP_CWORD]}"
187 if [ $# -gt 2 ]; then
196 COMPREPLY
=($
(compgen
-P "${2-}" \
197 -W "$(__gitcomp_1 "${1-}" "${4-}")" \
203 # __git_heads accepts 0 or 1 arguments (to pass to __gitdir)
206 local cmd i is_hash
=y dir
="$(__gitdir "${1-}")"
207 if [ -d "$dir" ]; then
208 git
--git-dir="$dir" for-each-ref
--format='%(refname:short)' \
212 for i
in $
(git ls-remote
"${1-}" 2>/dev
/null
); do
213 case "$is_hash,$i" in
216 n
,refs
/heads
/*) is_hash
=y
; echo "${i#refs/heads/}" ;;
217 n
,*) is_hash
=y
; echo "$i" ;;
222 # __git_tags accepts 0 or 1 arguments (to pass to __gitdir)
225 local cmd i is_hash
=y dir
="$(__gitdir "${1-}")"
226 if [ -d "$dir" ]; then
227 git
--git-dir="$dir" for-each-ref
--format='%(refname:short)' \
231 for i
in $
(git ls-remote
"${1-}" 2>/dev
/null
); do
232 case "$is_hash,$i" in
235 n
,refs
/tags
/*) is_hash
=y
; echo "${i#refs/tags/}" ;;
236 n
,*) is_hash
=y
; echo "$i" ;;
241 # __git_refs accepts 0 or 1 arguments (to pass to __gitdir)
244 local i is_hash
=y dir
="$(__gitdir "${1-}")"
245 local cur
="${COMP_WORDS[COMP_CWORD]}" format refs
246 if [ -d "$dir" ]; then
253 for i
in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD
; do
254 if [ -e "$dir/$i" ]; then echo $i; fi
256 format
="refname:short"
257 refs
="refs/tags refs/heads refs/remotes"
260 git
--git-dir="$dir" for-each-ref
--format="%($format)" \
264 for i
in $
(git ls-remote
"$dir" 2>/dev
/null
); do
265 case "$is_hash,$i" in
268 n
,refs
/tags
/*) is_hash
=y
; echo "${i#refs/tags/}" ;;
269 n
,refs
/heads
/*) is_hash
=y
; echo "${i#refs/heads/}" ;;
270 n
,refs
/remotes
/*) is_hash
=y
; echo "${i#refs/remotes/}" ;;
271 n
,*) is_hash
=y
; echo "$i" ;;
276 # __git_refs2 requires 1 argument (to pass to __git_refs)
280 for i
in $
(__git_refs
"$1"); do
285 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
286 __git_refs_remotes
()
288 local cmd i is_hash
=y
289 for i
in $
(git ls-remote
"$1" 2>/dev
/null
); do
290 case "$is_hash,$i" in
293 echo "$i:refs/remotes/$1/${i#refs/heads/}"
297 n
,refs
/tags
/*) is_hash
=y
;;
305 local i ngoff IFS
=$
'\n' d
="$(__gitdir)"
306 shopt -q nullglob || ngoff
=1
308 for i
in "$d/remotes"/*; do
309 echo ${i#$d/remotes/}
311 [ "$ngoff" ] && shopt -u nullglob
312 for i
in $
(git
--git-dir="$d" config
--get-regexp 'remote\..*\.url' 2>/dev
/null
); do
318 __git_list_merge_strategies
()
320 git merge
-s help 2>&1 |
321 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
330 __git_merge_strategies
=
331 # 'git merge -s help' (and thus detection of the merge strategy
332 # list) fails, unfortunately, if run outside of any git working
333 # tree. __git_merge_strategies is set to the empty string in
334 # that case, and the detection will be repeated the next time it
336 __git_compute_merge_strategies
()
338 : ${__git_merge_strategies:=$(__git_list_merge_strategies)}
341 __git_complete_file
()
343 local pfx
ls ref cur
="${COMP_WORDS[COMP_CWORD]}"
360 case "$COMP_WORDBREAKS" in
362 *) pfx
="$ref:$pfx" ;;
366 COMPREPLY
=($
(compgen
-P "$pfx" \
367 -W "$(git --git-dir="$
(__gitdir
)" ls-tree "$ls" \
368 | sed '/^100... blob /{
384 __gitcomp
"$(__git_refs)"
389 __git_complete_revlist
()
391 local pfx cur
="${COMP_WORDS[COMP_CWORD]}"
396 __gitcomp
"$(__git_refs)" "$pfx" "$cur"
401 __gitcomp
"$(__git_refs)" "$pfx" "$cur"
404 __gitcomp
"$(__git_refs)"
409 __git_complete_remote_or_refspec
()
411 local cmd
="${COMP_WORDS[1]}"
412 local cur
="${COMP_WORDS[COMP_CWORD]}"
413 local i c
=2 remote
="" pfx
="" lhs
=1 no_complete_refspec
=0
414 while [ $c -lt $COMP_CWORD ]; do
417 --mirror) [ "$cmd" = "push" ] && no_complete_refspec
=1 ;;
420 push
) no_complete_refspec
=1 ;;
429 *) remote
="$i"; break ;;
433 if [ -z "$remote" ]; then
434 __gitcomp
"$(__git_remotes)"
437 if [ $no_complete_refspec = 1 ]; then
441 [ "$remote" = "." ] && remote
=
444 case "$COMP_WORDBREAKS" in
446 *) pfx
="${cur%%:*}:" ;;
458 if [ $lhs = 1 ]; then
459 __gitcomp
"$(__git_refs2 "$remote")" "$pfx" "$cur"
461 __gitcomp
"$(__git_refs)" "$pfx" "$cur"
465 if [ $lhs = 1 ]; then
466 __gitcomp
"$(__git_refs "$remote")" "$pfx" "$cur"
468 __gitcomp
"$(__git_refs)" "$pfx" "$cur"
472 if [ $lhs = 1 ]; then
473 __gitcomp
"$(__git_refs)" "$pfx" "$cur"
475 __gitcomp
"$(__git_refs "$remote")" "$pfx" "$cur"
481 __git_complete_strategy
()
483 __git_compute_merge_strategies
484 case "${COMP_WORDS[COMP_CWORD-1]}" in
486 __gitcomp
"$__git_merge_strategies"
489 local cur
="${COMP_WORDS[COMP_CWORD]}"
492 __gitcomp
"$__git_merge_strategies" "" "${cur##--strategy=}"
499 __git_list_all_commands
()
502 for i
in $
(git
help -a|
egrep '^ [a-zA-Z0-9]')
505 *--*) : helper pattern
;;
512 __git_compute_all_commands
()
514 : ${__git_all_commands:=$(__git_list_all_commands)}
517 __git_list_porcelain_commands
()
520 __git_compute_all_commands
521 for i
in "help" $__git_all_commands
524 *--*) : helper pattern
;;
525 applymbox
) : ask gittus
;;
526 applypatch
) : ask gittus
;;
527 archimport
) : import
;;
528 cat-file
) : plumbing
;;
529 check-attr
) : plumbing
;;
530 check-ref-format
) : plumbing
;;
531 checkout-index
) : plumbing
;;
532 commit-tree
) : plumbing
;;
533 count-objects
) : infrequent
;;
534 cvsexportcommit
) : export;;
535 cvsimport
) : import
;;
536 cvsserver
) : daemon
;;
538 diff-files
) : plumbing
;;
539 diff-index
) : plumbing
;;
540 diff-tree
) : plumbing
;;
541 fast-import
) : import
;;
542 fast-export
) : export;;
543 fsck-objects
) : plumbing
;;
544 fetch-pack
) : plumbing
;;
545 fmt-merge-msg
) : plumbing
;;
546 for-each-ref
) : plumbing
;;
547 hash-object
) : plumbing
;;
548 http-
*) : transport
;;
549 index-pack
) : plumbing
;;
550 init-db
) : deprecated
;;
551 local-fetch
) : plumbing
;;
552 lost-found
) : infrequent
;;
553 ls-files
) : plumbing
;;
554 ls-remote
) : plumbing
;;
555 ls-tree
) : plumbing
;;
556 mailinfo
) : plumbing
;;
557 mailsplit
) : plumbing
;;
558 merge-
*) : plumbing
;;
561 pack-objects
) : plumbing
;;
562 pack-redundant
) : plumbing
;;
563 pack-refs
) : plumbing
;;
564 parse-remote
) : plumbing
;;
565 patch-id
) : plumbing
;;
566 peek-remote
) : plumbing
;;
568 prune-packed
) : plumbing
;;
569 quiltimport
) : import
;;
570 read-tree
) : plumbing
;;
571 receive-pack
) : plumbing
;;
573 remote-
*) : transport
;;
574 repo-config
) : deprecated
;;
576 rev-list
) : plumbing
;;
577 rev-parse
) : plumbing
;;
578 runstatus
) : plumbing
;;
579 sh-setup
) : internal
;;
581 show-ref
) : plumbing
;;
582 send-pack
) : plumbing
;;
583 show-index
) : plumbing
;;
585 stripspace
) : plumbing
;;
586 symbolic-ref
) : plumbing
;;
587 tar-tree
) : deprecated
;;
588 unpack-file
) : plumbing
;;
589 unpack-objects
) : plumbing
;;
590 update-index
) : plumbing
;;
591 update-ref
) : plumbing
;;
592 update-server-info
) : daemon
;;
593 upload-archive
) : plumbing
;;
594 upload-pack
) : plumbing
;;
595 write-tree
) : plumbing
;;
597 verify-pack
) : infrequent
;;
598 verify-tag
) : plumbing
;;
604 __git_porcelain_commands
=
605 __git_compute_porcelain_commands
()
607 __git_compute_all_commands
608 : ${__git_porcelain_commands:=$(__git_list_porcelain_commands)}
614 for i
in $
(git
--git-dir="$(__gitdir)" config
--get-regexp "alias\..*" 2>/dev
/null
); do
624 # __git_aliased_command requires 1 argument
625 __git_aliased_command
()
627 local word cmdline
=$
(git
--git-dir="$(__gitdir)" \
628 config
--get "alias.$1")
629 for word
in $cmdline; do
635 \
!*) : shell
command alias ;;
637 *=*) : setting env
;;
646 # __git_find_on_cmdline requires 1 argument
647 __git_find_on_cmdline
()
649 local word subcommand c
=1
651 while [ $c -lt $COMP_CWORD ]; do
652 word
="${COMP_WORDS[c]}"
653 for subcommand
in $1; do
654 if [ "$subcommand" = "$word" ]; then
663 __git_has_doubledash
()
666 while [ $c -lt $COMP_CWORD ]; do
667 if [ "--" = "${COMP_WORDS[c]}" ]; then
675 __git_whitespacelist
="nowarn warn error error-all fix"
679 local cur
="${COMP_WORDS[COMP_CWORD]}" dir
="$(__gitdir)"
680 if [ -d "$dir"/rebase-apply
]; then
681 __gitcomp
"--skip --continue --resolved --abort"
686 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
691 --3way --committer-date-is-author-date --ignore-date
692 --ignore-whitespace --ignore-space-change
693 --interactive --keep --no-utf8 --signoff --utf8
694 --whitespace= --scissors
703 local cur
="${COMP_WORDS[COMP_CWORD]}"
706 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
711 --stat --numstat --summary --check --index
712 --cached --index-info --reverse --reject --unidiff-zero
713 --apply --no-add --exclude=
714 --ignore-whitespace --ignore-space-change
715 --whitespace= --inaccurate-eof --verbose
724 __git_has_doubledash
&& return
726 local cur
="${COMP_WORDS[COMP_CWORD]}"
730 --interactive --refresh --patch --update --dry-run
731 --ignore-errors --intent-to-add
740 local cur
="${COMP_WORDS[COMP_CWORD]}"
743 __gitcomp
"$(git archive --list)" "" "${cur##--format=}"
747 __gitcomp
"$(__git_remotes)" "" "${cur##--remote=}"
752 --format= --list --verbose
753 --prefix= --remote= --exec=
763 __git_has_doubledash
&& return
765 local subcommands
="start bad good skip reset visualize replay log run"
766 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
767 if [ -z "$subcommand" ]; then
768 __gitcomp
"$subcommands"
772 case "$subcommand" in
774 __gitcomp
"$(__git_refs)"
784 local i c
=1 only_local_ref
="n" has_r
="n"
786 while [ $c -lt $COMP_CWORD ]; do
789 -d|
-m) only_local_ref
="y" ;;
795 case "${COMP_WORDS[COMP_CWORD]}" in
798 --color --no-color --verbose --abbrev= --no-abbrev
799 --track --no-track --contains --merged --no-merged
803 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
804 __gitcomp
"$(__git_heads)"
806 __gitcomp
"$(__git_refs)"
814 local cmd
="${COMP_WORDS[2]}"
815 case "$COMP_CWORD" in
817 __gitcomp
"create list-heads verify unbundle"
825 __git_complete_revlist
834 __git_has_doubledash
&& return
836 local cur
="${COMP_WORDS[COMP_CWORD]}"
839 __gitcomp
"diff3 merge" "" "${cur##--conflict=}"
843 --quiet --ours --theirs --track --no-track --merge
848 __gitcomp
"$(__git_refs)"
855 __gitcomp
"$(__git_refs)"
860 local cur
="${COMP_WORDS[COMP_CWORD]}"
863 __gitcomp
"--edit --no-commit"
866 __gitcomp
"$(__git_refs)"
873 __git_has_doubledash
&& return
875 local cur
="${COMP_WORDS[COMP_CWORD]}"
878 __gitcomp
"--dry-run --quiet"
887 local cur
="${COMP_WORDS[COMP_CWORD]}"
912 __git_has_doubledash
&& return
914 local cur
="${COMP_WORDS[COMP_CWORD]}"
917 __gitcomp
"default strip verbatim whitespace
918 " "" "${cur##--cleanup=}"
922 __gitcomp
"$(__git_refs)" "" "${cur##--reuse-message=}"
926 __gitcomp
"$(__git_refs)" "" "${cur##--reedit-message=}"
930 __gitcomp
"all no normal" "" "${cur##--untracked-files=}"
935 --all --author= --signoff --verify --no-verify
936 --edit --amend --include --only --interactive
937 --dry-run --reuse-message= --reedit-message=
938 --reset-author --file= --message= --template=
939 --cleanup= --untracked-files --untracked-files=
949 local cur
="${COMP_WORDS[COMP_CWORD]}"
953 --all --tags --contains --abbrev= --candidates=
954 --exact-match --debug --long --match --always
958 __gitcomp
"$(__git_refs)"
961 __git_diff_common_options
="--stat --numstat --shortstat --summary
962 --patch-with-stat --name-only --name-status --color
963 --no-color --color-words --no-renames --check
964 --full-index --binary --abbrev --diff-filter=
966 --text --ignore-space-at-eol --ignore-space-change
967 --ignore-all-space --exit-code --quiet --ext-diff
969 --no-prefix --src-prefix= --dst-prefix=
970 --inter-hunk-context=
973 --dirstat --dirstat= --dirstat-by-file
974 --dirstat-by-file= --cumulative
979 __git_has_doubledash
&& return
981 local cur
="${COMP_WORDS[COMP_CWORD]}"
984 __gitcomp
"--cached --staged --pickaxe-all --pickaxe-regex
985 --base --ours --theirs
986 $__git_diff_common_options
994 __git_mergetools_common
="diffuse ecmerge emerge kdiff3 meld opendiff
995 tkdiff vimdiff gvimdiff xxdiff araxis p4merge
1000 __git_has_doubledash
&& return
1002 local cur
="${COMP_WORDS[COMP_CWORD]}"
1005 __gitcomp
"$__git_mergetools_common kompare" "" "${cur##--tool=}"
1009 __gitcomp
"--cached --staged --pickaxe-all --pickaxe-regex
1010 --base --ours --theirs
1011 --no-renames --diff-filter= --find-copies-harder
1012 --relative --ignore-submodules
1020 __git_fetch_options
="
1021 --quiet --verbose --append --upload-pack --force --keep --depth=
1022 --tags --no-tags --all --prune --dry-run
1027 local cur
="${COMP_WORDS[COMP_CWORD]}"
1030 __gitcomp
"$__git_fetch_options"
1034 __git_complete_remote_or_refspec
1037 _git_format_patch
()
1039 local cur
="${COMP_WORDS[COMP_CWORD]}"
1044 " "" "${cur##--thread=}"
1049 --stdout --attach --no-attach --thread --thread=
1051 --numbered --start-number
1055 --in-reply-to= --cc=
1056 --full-index --binary
1059 --no-prefix --src-prefix= --dst-prefix=
1060 --inline --suffix= --ignore-if-in-upstream
1066 __git_complete_revlist
1071 local cur
="${COMP_WORDS[COMP_CWORD]}"
1075 --tags --root --unreachable --cache --no-reflogs --full
1076 --strict --verbose --lost-found
1086 local cur
="${COMP_WORDS[COMP_CWORD]}"
1089 __gitcomp
"--prune --aggressive"
1103 __git_has_doubledash
&& return
1105 local cur
="${COMP_WORDS[COMP_CWORD]}"
1110 --text --ignore-case --word-regexp --invert-match
1112 --extended-regexp --basic-regexp --fixed-strings
1113 --files-with-matches --name-only
1114 --files-without-match
1117 --and --or --not --all-match
1123 __gitcomp
"$(__git_refs)"
1128 local cur
="${COMP_WORDS[COMP_CWORD]}"
1131 __gitcomp
"--all --info --man --web"
1135 __git_compute_all_commands
1136 __gitcomp
"$__git_all_commands
1137 attributes cli core-tutorial cvs-migration
1138 diffcore gitk glossary hooks ignore modules
1139 repository-layout tutorial tutorial-2
1146 local cur
="${COMP_WORDS[COMP_CWORD]}"
1150 false true umask group all world everybody
1151 " "" "${cur##--shared=}"
1155 __gitcomp
"--quiet --bare --template= --shared --shared="
1164 __git_has_doubledash
&& return
1166 local cur
="${COMP_WORDS[COMP_CWORD]}"
1169 __gitcomp
"--cached --deleted --modified --others --ignored
1170 --stage --directory --no-empty-directory --unmerged
1171 --killed --exclude= --exclude-from=
1172 --exclude-per-directory= --exclude-standard
1173 --error-unmatch --with-tree= --full-name
1174 --abbrev --ignored --exclude-per-directory
1184 __gitcomp
"$(__git_remotes)"
1192 # Options that go well for log, shortlog and gitk
1193 __git_log_common_options
="
1195 --branches --tags --remotes
1196 --first-parent --merges --no-merges
1198 --max-age= --since= --after=
1199 --min-age= --until= --before=
1201 # Options that go well for log and gitk (not shortlog)
1202 __git_log_gitk_options
="
1203 --dense --sparse --full-history
1204 --simplify-merges --simplify-by-decoration
1207 # Options that go well for log and shortlog (not gitk)
1208 __git_log_shortlog_options
="
1209 --author= --committer= --grep=
1213 __git_log_pretty_formats
="oneline short medium full fuller email raw format:"
1214 __git_log_date_formats
="relative iso8601 rfc2822 short local default raw"
1218 __git_has_doubledash
&& return
1220 local cur
="${COMP_WORDS[COMP_CWORD]}"
1221 local g
="$(git rev-parse --git-dir 2>/dev/null)"
1223 if [ -f "$g/MERGE_HEAD" ]; then
1228 __gitcomp
"$__git_log_pretty_formats
1229 " "" "${cur##--pretty=}"
1233 __gitcomp
"$__git_log_pretty_formats
1234 " "" "${cur##--format=}"
1238 __gitcomp
"$__git_log_date_formats" "" "${cur##--date=}"
1242 __gitcomp
"long short" "" "${cur##--decorate=}"
1247 $__git_log_common_options
1248 $__git_log_shortlog_options
1249 $__git_log_gitk_options
1250 --root --topo-order --date-order --reverse
1251 --follow --full-diff
1252 --abbrev-commit --abbrev=
1253 --relative-date --date=
1254 --pretty= --format= --oneline
1257 --decorate --decorate=
1259 --parents --children
1261 $__git_diff_common_options
1262 --pickaxe-all --pickaxe-regex
1267 __git_complete_revlist
1270 __git_merge_options
="
1271 --no-commit --no-stat --log --no-log --squash --strategy
1272 --commit --stat --no-squash --ff --no-ff --ff-only
1277 __git_complete_strategy
&& return
1279 local cur
="${COMP_WORDS[COMP_CWORD]}"
1282 __gitcomp
"$__git_merge_options"
1285 __gitcomp
"$(__git_refs)"
1290 local cur
="${COMP_WORDS[COMP_CWORD]}"
1293 __gitcomp
"$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1306 __gitcomp
"$(__git_refs)"
1311 local cur
="${COMP_WORDS[COMP_CWORD]}"
1314 __gitcomp
"--dry-run"
1323 __gitcomp
"--tags --all --stdin"
1328 local subcommands
="edit show"
1329 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
1330 __gitcomp
"$subcommands"
1334 case "${COMP_WORDS[COMP_CWORD-1]}" in
1339 __gitcomp
"$(__git_refs)"
1346 __git_complete_strategy
&& return
1348 local cur
="${COMP_WORDS[COMP_CWORD]}"
1352 --rebase --no-rebase
1353 $__git_merge_options
1354 $__git_fetch_options
1359 __git_complete_remote_or_refspec
1364 local cur
="${COMP_WORDS[COMP_CWORD]}"
1365 case "${COMP_WORDS[COMP_CWORD-1]}" in
1367 __gitcomp
"$(__git_remotes)"
1372 __gitcomp
"$(__git_remotes)" "" "${cur##--repo=}"
1377 --all --mirror --tags --dry-run --force --verbose
1378 --receive-pack= --repo=
1383 __git_complete_remote_or_refspec
1388 local cur
="${COMP_WORDS[COMP_CWORD]}" dir
="$(__gitdir)"
1389 if [ -d "$dir"/rebase-apply
] ||
[ -d "$dir"/rebase-merge
]; then
1390 __gitcomp
"--continue --skip --abort"
1393 __git_complete_strategy
&& return
1396 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
1401 --onto --merge --strategy --interactive
1402 --preserve-merges --stat --no-stat
1403 --committer-date-is-author-date --ignore-date
1404 --ignore-whitespace --whitespace=
1410 __gitcomp
"$(__git_refs)"
1413 __git_send_email_confirm_options
="always never auto cc compose"
1414 __git_send_email_suppresscc_options
="author self cc bodycc sob cccmd body all"
1418 local cur
="${COMP_WORDS[COMP_CWORD]}"
1422 $__git_send_email_confirm_options
1423 " "" "${cur##--confirm=}"
1428 $__git_send_email_suppresscc_options
1429 " "" "${cur##--suppress-cc=}"
1433 --smtp-encryption=*)
1434 __gitcomp
"ssl tls" "" "${cur##--smtp-encryption=}"
1438 __gitcomp
"--annotate --bcc --cc --cc-cmd --chain-reply-to
1439 --compose --confirm= --dry-run --envelope-sender
1441 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1442 --no-suppress-from --no-thread --quiet
1443 --signed-off-by-cc --smtp-pass --smtp-server
1444 --smtp-server-port --smtp-encryption= --smtp-user
1445 --subject --suppress-cc= --suppress-from --thread --to
1446 --validate --no-validate"
1458 __git_config_get_set_variables
()
1460 local prevword word config_file
= c
=$COMP_CWORD
1461 while [ $c -gt 1 ]; do
1462 word
="${COMP_WORDS[c]}"
1464 --global|
--system|
--file=*)
1469 config_file
="$word $prevword"
1477 git
--git-dir="$(__gitdir)" config
$config_file --list 2>/dev
/null |
1490 local cur
="${COMP_WORDS[COMP_CWORD]}"
1491 local prv
="${COMP_WORDS[COMP_CWORD-1]}"
1494 __gitcomp
"$(__git_remotes)"
1498 __gitcomp
"$(__git_refs)"
1502 local remote
="${prv#remote.}"
1503 remote
="${remote%.fetch}"
1504 __gitcomp
"$(__git_refs_remotes "$remote")"
1508 local remote
="${prv#remote.}"
1509 remote
="${remote%.push}"
1510 __gitcomp
"$(git --git-dir="$
(__gitdir
)" \
1511 for-each-ref --format='%(refname):%(refname)' \
1515 pull.twohead|pull.octopus
)
1516 __git_compute_merge_strategies
1517 __gitcomp
"$__git_merge_strategies"
1520 color.branch|color.
diff|color.interactive|\
1521 color.showbranch|color.status|color.ui
)
1522 __gitcomp
"always never auto"
1526 __gitcomp
"false true"
1531 normal black red green yellow blue magenta cyan white
1532 bold dim ul blink reverse
1537 __gitcomp
"man info web html"
1541 __gitcomp
"$__git_log_date_formats"
1544 sendemail.aliasesfiletype
)
1545 __gitcomp
"mutt mailrc pine elm gnus"
1549 __gitcomp
"$__git_send_email_confirm_options"
1552 sendemail.suppresscc
)
1553 __gitcomp
"$__git_send_email_suppresscc_options"
1556 --get|
--get-all|
--unset|
--unset-all)
1557 __gitcomp
"$(__git_config_get_set_variables)"
1568 --global --system --file=
1569 --list --replace-all
1570 --get --get-all --get-regexp
1571 --add --unset --unset-all
1572 --remove-section --rename-section
1577 local pfx
="${cur%.*}."
1579 __gitcomp
"remote merge mergeoptions rebase" "$pfx" "$cur"
1583 local pfx
="${cur%.*}."
1585 __gitcomp
"$(__git_heads)" "$pfx" "$cur" "."
1589 local pfx
="${cur%.*}."
1592 argprompt cmd confirm needsfile noconsole norescan
1593 prompt revprompt revunmerged title
1598 local pfx
="${cur%.*}."
1600 __gitcomp
"cmd path" "$pfx" "$cur"
1604 local pfx
="${cur%.*}."
1606 __gitcomp
"cmd path" "$pfx" "$cur"
1610 local pfx
="${cur%.*}."
1612 __gitcomp
"cmd path trustExitCode" "$pfx" "$cur"
1616 local pfx
="${cur%.*}."
1618 __git_compute_all_commands
1619 __gitcomp
"$__git_all_commands" "$pfx" "$cur"
1623 local pfx
="${cur%.*}."
1626 url proxy fetch push mirror skipDefaultUpdate
1627 receivepack uploadpack tagopt pushurl
1632 local pfx
="${cur%.*}."
1634 __gitcomp
"$(__git_remotes)" "$pfx" "$cur" "."
1638 local pfx
="${cur%.*}."
1640 __gitcomp
"insteadOf pushInsteadOf" "$pfx" "$cur"
1647 apply.ignorewhitespace
1649 branch.autosetupmerge
1650 branch.autosetuprebase
1653 color.branch.current
1664 color.diff.whitespace
1669 color.interactive.header
1670 color.interactive.help
1671 color.interactive.prompt
1676 color.status.changed
1678 color.status.nobranch
1679 color.status.untracked
1680 color.status.updated
1687 core.deltaBaseCacheLimit
1691 core.fsyncobjectfiles
1693 core.ignoreCygwinFSTricks
1695 core.logAllRefUpdates
1696 core.loosecompression
1698 core.packedGitWindowSize
1700 core.preferSymlinkRefs
1703 core.repositoryFormatVersion
1705 core.sharedRepository
1708 core.warnAmbiguousRefs
1711 diff.autorefreshindex
1717 diff.suppressBlankEmpty
1729 format.subjectprefix
1738 gc.reflogexpireunreachable
1742 gitcvs.commitmsgannotation
1743 gitcvs.dbTableNamePrefix
1754 gui.copyblamethreshold
1758 gui.matchtrackingbranch
1759 gui.newbranchtemplate
1760 gui.pruneduringfetch
1761 gui.spellingdictionary
1777 i18n.logOutputEncoding
1782 imap.preformattedHTML
1791 interactive.singlekey
1804 mergetool.keepBackup
1807 pack.deltaCacheLimit
1820 receive.denyCurrentBranch
1822 receive.denyNonFastForwards
1825 repack.usedeltabaseoffset
1828 sendemail.aliasesfile
1829 sendemail.aliasesfiletype
1833 sendemail.chainreplyto
1835 sendemail.envelopesender
1837 sendemail.signedoffbycc
1838 sendemail.smtpencryption
1840 sendemail.smtpserver
1841 sendemail.smtpserverport
1843 sendemail.suppresscc
1844 sendemail.suppressfrom
1849 status.relativePaths
1850 status.showUntrackedFiles
1852 transfer.unpackLimit
1864 local subcommands
="add rename rm show prune update set-head"
1865 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1866 if [ -z "$subcommand" ]; then
1867 __gitcomp
"$subcommands"
1871 case "$subcommand" in
1872 rename|
rm|show|prune
)
1873 __gitcomp
"$(__git_remotes)"
1876 local i c
='' IFS
=$
'\n'
1877 for i
in $
(git
--git-dir="$(__gitdir)" config
--get-regexp "remotes\..*" 2>/dev
/null
); do
1891 __gitcomp
"$(__git_refs)"
1896 __git_has_doubledash
&& return
1898 local cur
="${COMP_WORDS[COMP_CWORD]}"
1901 __gitcomp
"--merge --mixed --hard --soft --patch"
1905 __gitcomp
"$(__git_refs)"
1910 local cur
="${COMP_WORDS[COMP_CWORD]}"
1913 __gitcomp
"--edit --mainline --no-edit --no-commit --signoff"
1917 __gitcomp
"$(__git_refs)"
1922 __git_has_doubledash
&& return
1924 local cur
="${COMP_WORDS[COMP_CWORD]}"
1927 __gitcomp
"--cached --dry-run --ignore-unmatch --quiet"
1936 __git_has_doubledash
&& return
1938 local cur
="${COMP_WORDS[COMP_CWORD]}"
1942 $__git_log_common_options
1943 $__git_log_shortlog_options
1944 --numbered --summary
1949 __git_complete_revlist
1954 __git_has_doubledash
&& return
1956 local cur
="${COMP_WORDS[COMP_CWORD]}"
1959 __gitcomp
"$__git_log_pretty_formats
1960 " "" "${cur##--pretty=}"
1964 __gitcomp
"$__git_log_pretty_formats
1965 " "" "${cur##--format=}"
1969 __gitcomp
"--pretty= --format= --abbrev-commit --oneline
1970 $__git_diff_common_options
1980 local cur
="${COMP_WORDS[COMP_CWORD]}"
1984 --all --remotes --topo-order --current --more=
1985 --list --independent --merge-base --no-name
1987 --sha1-name --sparse --topics --reflog
1992 __git_complete_revlist
1997 local cur
="${COMP_WORDS[COMP_CWORD]}"
1998 local save_opts
='--keep-index --no-keep-index --quiet --patch'
1999 local subcommands
='save list show apply clear drop pop create branch'
2000 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
2001 if [ -z "$subcommand" ]; then
2004 __gitcomp
"$save_opts"
2007 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2008 __gitcomp
"$subcommands"
2015 case "$subcommand,$cur" in
2017 __gitcomp
"$save_opts"
2020 __gitcomp
"--index --quiet"
2022 show
,--*|drop
,--*|branch
,--*)
2025 show
,*|apply
,*|drop
,*|pop
,*|branch
,*)
2026 __gitcomp
"$(git --git-dir="$
(__gitdir
)" stash list \
2027 | sed -n -e 's/:.*//p')"
2038 __git_has_doubledash
&& return
2040 local subcommands
="add status init update summary foreach sync"
2041 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2042 local cur
="${COMP_WORDS[COMP_CWORD]}"
2045 __gitcomp
"--quiet --cached"
2048 __gitcomp
"$subcommands"
2058 init fetch clone rebase dcommit log find-rev
2059 set-tree commit-diff info create-ignore propget
2060 proplist show-ignore show-externals branch tag blame
2061 migrate mkdirs reset gc
2063 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
2064 if [ -z "$subcommand" ]; then
2065 __gitcomp
"$subcommands"
2067 local remote_opts
="--username= --config-dir= --no-auth-cache"
2069 --follow-parent --authors-file= --repack=
2070 --no-metadata --use-svm-props --use-svnsync-props
2071 --log-window-size= --no-checkout --quiet
2072 --repack-flags --use-log-author --localtime
2073 --ignore-paths= $remote_opts
2076 --template= --shared= --trunk= --tags=
2077 --branches= --stdlayout --minimize-url
2078 --no-metadata --use-svm-props --use-svnsync-props
2079 --rewrite-root= --prefix= --use-log-author
2080 --add-author-from $remote_opts
2083 --edit --rmdir --find-copies-harder --copy-similarity=
2086 local cur
="${COMP_WORDS[COMP_CWORD]}"
2087 case "$subcommand,$cur" in
2089 __gitcomp
"--revision= --fetch-all $fc_opts"
2092 __gitcomp
"--revision= $fc_opts $init_opts"
2095 __gitcomp
"$init_opts"
2099 --merge --strategy= --verbose --dry-run
2100 --fetch-all --no-rebase --commit-url
2101 --revision $cmt_opts $fc_opts
2105 __gitcomp
"--stdin $cmt_opts $fc_opts"
2107 create-ignore
,--*|propget
,--*|proplist
,--*|show-ignore
,--*|\
2108 show-externals
,--*|mkdirs
,--*)
2109 __gitcomp
"--revision="
2113 --limit= --revision= --verbose --incremental
2114 --oneline --show-commit --non-recursive
2115 --authors-file= --color
2120 --merge --verbose --strategy= --local
2121 --fetch-all --dry-run $fc_opts
2125 __gitcomp
"--message= --file= --revision= $cmt_opts"
2131 __gitcomp
"--dry-run --message --tag"
2134 __gitcomp
"--dry-run --message"
2137 __gitcomp
"--git-format"
2141 --config-dir= --ignore-paths= --minimize
2142 --no-auth-cache --username=
2146 __gitcomp
"--revision= --parent"
2158 while [ $c -lt $COMP_CWORD ]; do
2159 i
="${COMP_WORDS[c]}"
2162 __gitcomp
"$(__git_tags)"
2172 case "${COMP_WORDS[COMP_CWORD-1]}" in
2178 __gitcomp
"$(__git_tags)"
2184 __gitcomp
"$(__git_refs)"
2196 local i c
=1 command __git_dir
2198 while [ $c -lt $COMP_CWORD ]; do
2199 i
="${COMP_WORDS[c]}"
2201 --git-dir=*) __git_dir
="${i#--git-dir=}" ;;
2202 --bare) __git_dir
="." ;;
2203 --version|
-p|
--paginate) ;;
2204 --help) command="help"; break ;;
2205 *) command="$i"; break ;;
2210 if [ -z "$command" ]; then
2211 case "${COMP_WORDS[COMP_CWORD]}" in
2224 *) __git_compute_porcelain_commands
2225 __gitcomp
"$__git_porcelain_commands $(__git_aliases)" ;;
2230 local completion_func
="_git_${command//-/_}"
2231 declare -F $completion_func >/dev
/null
&& $completion_func && return
2233 local expansion
=$
(__git_aliased_command
"$command")
2234 if [ -n "$expansion" ]; then
2235 completion_func
="_git_${expansion//-/_}"
2236 declare -F $completion_func >/dev
/null
&& $completion_func
2242 __git_has_doubledash
&& return
2244 local cur
="${COMP_WORDS[COMP_CWORD]}"
2245 local g
="$(__gitdir)"
2247 if [ -f "$g/MERGE_HEAD" ]; then
2253 $__git_log_common_options
2254 $__git_log_gitk_options
2260 __git_complete_revlist
2263 complete
-o bashdefault
-o default
-o nospace
-F _git git
2>/dev
/null \
2264 || complete
-o default
-o nospace
-F _git git
2265 complete
-o bashdefault
-o default
-o nospace
-F _gitk gitk
2>/dev
/null \
2266 || complete
-o default
-o nospace
-F _gitk gitk
2268 # The following are necessary only for Cygwin, and only are needed
2269 # when the user has tab-completed the executable name and consequently
2270 # included the '.exe' suffix.
2272 if [ Cygwin
= "$(uname -o 2>/dev/null)" ]; then
2273 complete
-o bashdefault
-o default
-o nospace
-F _git git.exe
2>/dev
/null \
2274 || complete
-o default
-o nospace
-F _git git.exe