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) You may want to make sure the git executable is available
25 # in your PATH before this script is sourced, as some caching
26 # is performed while the script loads. If git isn't found
27 # at source time then all lookups will be done on demand,
28 # which may be slightly slower.
30 # 4) Consider changing your PS1 to also show the current branch:
31 # PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
33 # The argument to __git_ps1 will be displayed only if you
34 # are currently in a git repository. The %s token will be
35 # the name of the current branch.
37 # In addition, if you set GIT_PS1_SHOWDIRTYSTATE to a nonempty
38 # value, unstaged (*) and staged (+) changes will be shown next
39 # to the branch name. You can configure this per-repository
40 # with the bash.showDirtyState variable, which defaults to true
41 # once GIT_PS1_SHOWDIRTYSTATE is enabled.
43 # You can also see if currently something is stashed, by setting
44 # GIT_PS1_SHOWSTASHSTATE to a nonempty value. If something is stashed,
45 # then a '$' will be shown next to the branch name.
47 # If you would like to see if there're untracked files, then you can
48 # set GIT_PS1_SHOWUNTRACKEDFILES to a nonempty value. If there're
49 # untracked files, then a '%' will be shown next to the branch name.
53 # *) Read Documentation/SubmittingPatches
54 # *) Send all patches to the current maintainer:
56 # "Shawn O. Pearce" <spearce@spearce.org>
58 # *) Always CC the Git mailing list:
63 case "$COMP_WORDBREAKS" in
65 *) COMP_WORDBREAKS
="$COMP_WORDBREAKS:"
68 # __gitdir accepts 0 or 1 arguments (i.e., location)
69 # returns location of .git repo
72 if [ -z "${1-}" ]; then
73 if [ -n "${__git_dir-}" ]; then
75 elif [ -d .git
]; then
78 git rev-parse
--git-dir 2>/dev
/null
80 elif [ -d "$1/.git" ]; then
87 # __git_ps1 accepts 0 or 1 arguments (i.e., format string)
88 # returns text to add to bash PS1 prompt (includes branch name)
95 if [ -f "$g/rebase-merge/interactive" ]; then
97 b
="$(cat "$g/rebase-merge
/head-name
")"
98 elif [ -d "$g/rebase-merge" ]; then
100 b
="$(cat "$g/rebase-merge
/head-name
")"
102 if [ -d "$g/rebase-apply" ]; then
103 if [ -f "$g/rebase-apply/rebasing" ]; then
105 elif [ -f "$g/rebase-apply/applying" ]; then
110 elif [ -f "$g/MERGE_HEAD" ]; then
112 elif [ -f "$g/BISECT_LOG" ]; then
116 b
="$(git symbolic-ref HEAD 2>/dev/null)" ||
{
119 case "${GIT_PS1_DESCRIBE_STYLE-}" in
121 git describe --contains HEAD ;;
123 git describe --contains --all HEAD ;;
127 git describe --exact-match HEAD ;;
128 esac 2>/dev/null)" ||
130 b
="$(cut -c1-7 "$g/HEAD
" 2>/dev/null)..." ||
142 if [ "true" = "$(git rev-parse --is-inside-git-dir 2>/dev/null)" ]; then
143 if [ "true" = "$(git rev-parse --is-bare-repository 2>/dev/null)" ]; then
148 elif [ "true" = "$(git rev-parse --is-inside-work-tree 2>/dev/null)" ]; then
149 if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ]; then
150 if [ "$(git config --bool bash.showDirtyState)" != "false" ]; then
151 git
diff --no-ext-diff --ignore-submodules \
152 --quiet --exit-code || w
="*"
153 if git rev-parse
--quiet --verify HEAD
>/dev
/null
; then
154 git diff-index
--cached --quiet \
155 --ignore-submodules HEAD
-- || i
="+"
161 if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ]; then
162 git rev-parse
--verify refs
/stash
>/dev
/null
2>&1 && s
="$"
165 if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ]; then
166 if [ -n "$(git ls-files --others --exclude-standard)" ]; then
172 if [ -n "${1-}" ]; then
173 printf "$1" "$c${b##refs/heads/}$w$i$s$u$r"
175 printf " (%s)" "$c${b##refs/heads/}$w$i$s$u$r"
180 # __gitcomp_1 requires 2 arguments
183 local c IFS
=' '$
'\t'$
'\n'
186 --*=*) printf %s$
'\n' "$c$2" ;;
187 *.
) printf %s$
'\n' "$c$2" ;;
188 *) printf %s$
'\n' "$c$2 " ;;
193 # __gitcomp accepts 1, 2, 3, or 4 arguments
194 # generates completion reply with compgen
197 local cur
="${COMP_WORDS[COMP_CWORD]}"
198 if [ $# -gt 2 ]; then
207 COMPREPLY
=($
(compgen
-P "${2-}" \
208 -W "$(__gitcomp_1 "${1-}" "${4-}")" \
214 # __git_heads accepts 0 or 1 arguments (to pass to __gitdir)
217 local cmd i is_hash
=y dir
="$(__gitdir "${1-}")"
218 if [ -d "$dir" ]; then
219 git
--git-dir="$dir" for-each-ref
--format='%(refname:short)' \
223 for i
in $
(git ls-remote
"${1-}" 2>/dev
/null
); do
224 case "$is_hash,$i" in
227 n
,refs
/heads
/*) is_hash
=y
; echo "${i#refs/heads/}" ;;
228 n
,*) is_hash
=y
; echo "$i" ;;
233 # __git_tags accepts 0 or 1 arguments (to pass to __gitdir)
236 local cmd i is_hash
=y dir
="$(__gitdir "${1-}")"
237 if [ -d "$dir" ]; then
238 git
--git-dir="$dir" for-each-ref
--format='%(refname:short)' \
242 for i
in $
(git ls-remote
"${1-}" 2>/dev
/null
); do
243 case "$is_hash,$i" in
246 n
,refs
/tags
/*) is_hash
=y
; echo "${i#refs/tags/}" ;;
247 n
,*) is_hash
=y
; echo "$i" ;;
252 # __git_refs accepts 0 or 1 arguments (to pass to __gitdir)
255 local i is_hash
=y dir
="$(__gitdir "${1-}")"
256 local cur
="${COMP_WORDS[COMP_CWORD]}" format refs
257 if [ -d "$dir" ]; then
264 if [ -e "$dir/HEAD" ]; then echo HEAD
; fi
265 format
="refname:short"
266 refs
="refs/tags refs/heads refs/remotes"
269 git
--git-dir="$dir" for-each-ref
--format="%($format)" \
273 for i
in $
(git ls-remote
"$dir" 2>/dev
/null
); do
274 case "$is_hash,$i" in
277 n
,refs
/tags
/*) is_hash
=y
; echo "${i#refs/tags/}" ;;
278 n
,refs
/heads
/*) is_hash
=y
; echo "${i#refs/heads/}" ;;
279 n
,refs
/remotes
/*) is_hash
=y
; echo "${i#refs/remotes/}" ;;
280 n
,*) is_hash
=y
; echo "$i" ;;
285 # __git_refs2 requires 1 argument (to pass to __git_refs)
289 for i
in $
(__git_refs
"$1"); do
294 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
295 __git_refs_remotes
()
297 local cmd i is_hash
=y
298 for i
in $
(git ls-remote
"$1" 2>/dev
/null
); do
299 case "$is_hash,$i" in
302 echo "$i:refs/remotes/$1/${i#refs/heads/}"
306 n
,refs
/tags
/*) is_hash
=y
;;
314 local i ngoff IFS
=$
'\n' d
="$(__gitdir)"
315 shopt -q nullglob || ngoff
=1
317 for i
in "$d/remotes"/*; do
318 echo ${i#$d/remotes/}
320 [ "$ngoff" ] && shopt -u nullglob
321 for i
in $
(git
--git-dir="$d" config
--get-regexp 'remote\..*\.url' 2>/dev
/null
); do
327 __git_merge_strategies
()
329 if [ -n "${__git_merge_strategylist-}" ]; then
330 echo "$__git_merge_strategylist"
333 git merge
-s help 2>&1 |
334 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
342 __git_merge_strategylist
=
343 __git_merge_strategylist
=$
(__git_merge_strategies
2>/dev
/null
)
345 __git_complete_file
()
347 local pfx
ls ref cur
="${COMP_WORDS[COMP_CWORD]}"
364 case "$COMP_WORDBREAKS" in
366 *) pfx
="$ref:$pfx" ;;
370 COMPREPLY
=($
(compgen
-P "$pfx" \
371 -W "$(git --git-dir="$
(__gitdir
)" ls-tree "$ls" \
372 | sed '/^100... blob /{
388 __gitcomp
"$(__git_refs)"
393 __git_complete_revlist
()
395 local pfx cur
="${COMP_WORDS[COMP_CWORD]}"
400 __gitcomp
"$(__git_refs)" "$pfx" "$cur"
405 __gitcomp
"$(__git_refs)" "$pfx" "$cur"
408 __gitcomp
"$(__git_refs)"
413 __git_complete_remote_or_refspec
()
415 local cmd
="${COMP_WORDS[1]}"
416 local cur
="${COMP_WORDS[COMP_CWORD]}"
417 local i c
=2 remote
="" pfx
="" lhs
=1 no_complete_refspec
=0
418 while [ $c -lt $COMP_CWORD ]; do
421 --all|
--mirror) [ "$cmd" = "push" ] && no_complete_refspec
=1 ;;
423 *) remote
="$i"; break ;;
427 if [ -z "$remote" ]; then
428 __gitcomp
"$(__git_remotes)"
431 if [ $no_complete_refspec = 1 ]; then
435 [ "$remote" = "." ] && remote
=
438 case "$COMP_WORDBREAKS" in
440 *) pfx
="${cur%%:*}:" ;;
452 if [ $lhs = 1 ]; then
453 __gitcomp
"$(__git_refs2 "$remote")" "$pfx" "$cur"
455 __gitcomp
"$(__git_refs)" "$pfx" "$cur"
459 if [ $lhs = 1 ]; then
460 __gitcomp
"$(__git_refs "$remote")" "$pfx" "$cur"
462 __gitcomp
"$(__git_refs)" "$pfx" "$cur"
466 if [ $lhs = 1 ]; then
467 __gitcomp
"$(__git_refs)" "$pfx" "$cur"
469 __gitcomp
"$(__git_refs "$remote")" "$pfx" "$cur"
475 __git_complete_strategy
()
477 case "${COMP_WORDS[COMP_CWORD-1]}" in
479 __gitcomp
"$(__git_merge_strategies)"
482 local cur
="${COMP_WORDS[COMP_CWORD]}"
485 __gitcomp
"$(__git_merge_strategies)" "" "${cur##--strategy=}"
492 __git_all_commands
()
494 if [ -n "${__git_all_commandlist-}" ]; then
495 echo "$__git_all_commandlist"
499 for i
in $
(git
help -a|
egrep '^ ')
502 *--*) : helper pattern
;;
507 __git_all_commandlist
=
508 __git_all_commandlist
="$(__git_all_commands 2>/dev/null)"
510 __git_porcelain_commands
()
512 if [ -n "${__git_porcelain_commandlist-}" ]; then
513 echo "$__git_porcelain_commandlist"
517 for i
in "help" $
(__git_all_commands
)
520 *--*) : helper pattern
;;
521 applymbox
) : ask gittus
;;
522 applypatch
) : ask gittus
;;
523 archimport
) : import
;;
524 cat-file
) : plumbing
;;
525 check-attr
) : plumbing
;;
526 check-ref-format
) : plumbing
;;
527 checkout-index
) : plumbing
;;
528 commit-tree
) : plumbing
;;
529 count-objects
) : infrequent
;;
530 cvsexportcommit
) : export;;
531 cvsimport
) : import
;;
532 cvsserver
) : daemon
;;
534 diff-files
) : plumbing
;;
535 diff-index
) : plumbing
;;
536 diff-tree
) : plumbing
;;
537 fast-import
) : import
;;
538 fast-export
) : export;;
539 fsck-objects
) : plumbing
;;
540 fetch-pack
) : plumbing
;;
541 fmt-merge-msg
) : plumbing
;;
542 for-each-ref
) : plumbing
;;
543 hash-object
) : plumbing
;;
544 http-
*) : transport
;;
545 index-pack
) : plumbing
;;
546 init-db
) : deprecated
;;
547 local-fetch
) : plumbing
;;
548 lost-found
) : infrequent
;;
549 ls-files
) : plumbing
;;
550 ls-remote
) : plumbing
;;
551 ls-tree
) : plumbing
;;
552 mailinfo
) : plumbing
;;
553 mailsplit
) : plumbing
;;
554 merge-
*) : plumbing
;;
557 pack-objects
) : plumbing
;;
558 pack-redundant
) : plumbing
;;
559 pack-refs
) : plumbing
;;
560 parse-remote
) : plumbing
;;
561 patch-id
) : plumbing
;;
562 peek-remote
) : plumbing
;;
564 prune-packed
) : plumbing
;;
565 quiltimport
) : import
;;
566 read-tree
) : plumbing
;;
567 receive-pack
) : plumbing
;;
569 repo-config
) : deprecated
;;
571 rev-list
) : plumbing
;;
572 rev-parse
) : plumbing
;;
573 runstatus
) : plumbing
;;
574 sh-setup
) : internal
;;
576 show-ref
) : plumbing
;;
577 send-pack
) : plumbing
;;
578 show-index
) : plumbing
;;
580 stripspace
) : plumbing
;;
581 symbolic-ref
) : plumbing
;;
582 tar-tree
) : deprecated
;;
583 unpack-file
) : plumbing
;;
584 unpack-objects
) : plumbing
;;
585 update-index
) : plumbing
;;
586 update-ref
) : plumbing
;;
587 update-server-info
) : daemon
;;
588 upload-archive
) : plumbing
;;
589 upload-pack
) : plumbing
;;
590 write-tree
) : plumbing
;;
592 verify-pack
) : infrequent
;;
593 verify-tag
) : plumbing
;;
598 __git_porcelain_commandlist
=
599 __git_porcelain_commandlist
="$(__git_porcelain_commands 2>/dev/null)"
604 for i
in $
(git
--git-dir="$(__gitdir)" config
--get-regexp "alias\..*" 2>/dev
/null
); do
610 # __git_aliased_command requires 1 argument
611 __git_aliased_command
()
613 local word cmdline
=$
(git
--git-dir="$(__gitdir)" \
614 config
--get "alias.$1")
615 for word
in $cmdline; do
616 if [ "${word##-*}" ]; then
623 # __git_find_on_cmdline requires 1 argument
624 __git_find_on_cmdline
()
626 local word subcommand c
=1
628 while [ $c -lt $COMP_CWORD ]; do
629 word
="${COMP_WORDS[c]}"
630 for subcommand
in $1; do
631 if [ "$subcommand" = "$word" ]; then
640 __git_has_doubledash
()
643 while [ $c -lt $COMP_CWORD ]; do
644 if [ "--" = "${COMP_WORDS[c]}" ]; then
652 __git_whitespacelist
="nowarn warn error error-all fix"
656 local cur
="${COMP_WORDS[COMP_CWORD]}" dir
="$(__gitdir)"
657 if [ -d "$dir"/rebase-apply
]; then
658 __gitcomp
"--skip --resolved --abort"
663 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
668 --3way --committer-date-is-author-date --ignore-date
669 --ignore-whitespace --ignore-space-change
670 --interactive --keep --no-utf8 --signoff --utf8
680 local cur
="${COMP_WORDS[COMP_CWORD]}"
683 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
688 --stat --numstat --summary --check --index
689 --cached --index-info --reverse --reject --unidiff-zero
690 --apply --no-add --exclude=
691 --ignore-whitespace --ignore-space-change
692 --whitespace= --inaccurate-eof --verbose
701 __git_has_doubledash
&& return
703 local cur
="${COMP_WORDS[COMP_CWORD]}"
707 --interactive --refresh --patch --update --dry-run
708 --ignore-errors --intent-to-add
717 local cur
="${COMP_WORDS[COMP_CWORD]}"
720 __gitcomp
"$(git archive --list)" "" "${cur##--format=}"
724 __gitcomp
"$(__git_remotes)" "" "${cur##--remote=}"
729 --format= --list --verbose
730 --prefix= --remote= --exec=
740 __git_has_doubledash
&& return
742 local subcommands
="start bad good skip reset visualize replay log run"
743 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
744 if [ -z "$subcommand" ]; then
745 __gitcomp
"$subcommands"
749 case "$subcommand" in
751 __gitcomp
"$(__git_refs)"
761 local i c
=1 only_local_ref
="n" has_r
="n"
763 while [ $c -lt $COMP_CWORD ]; do
766 -d|
-m) only_local_ref
="y" ;;
772 case "${COMP_WORDS[COMP_CWORD]}" in
775 --color --no-color --verbose --abbrev= --no-abbrev
776 --track --no-track --contains --merged --no-merged
780 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
781 __gitcomp
"$(__git_heads)"
783 __gitcomp
"$(__git_refs)"
791 local cmd
="${COMP_WORDS[2]}"
792 case "$COMP_CWORD" in
794 __gitcomp
"create list-heads verify unbundle"
802 __git_complete_revlist
811 __git_has_doubledash
&& return
813 local cur
="${COMP_WORDS[COMP_CWORD]}"
816 __gitcomp
"diff3 merge" "" "${cur##--conflict=}"
820 --quiet --ours --theirs --track --no-track --merge
825 __gitcomp
"$(__git_refs)"
832 __gitcomp
"$(__git_refs)"
837 local cur
="${COMP_WORDS[COMP_CWORD]}"
840 __gitcomp
"--edit --no-commit"
843 __gitcomp
"$(__git_refs)"
850 __git_has_doubledash
&& return
852 local cur
="${COMP_WORDS[COMP_CWORD]}"
855 __gitcomp
"--dry-run --quiet"
864 local cur
="${COMP_WORDS[COMP_CWORD]}"
889 __git_has_doubledash
&& return
891 local cur
="${COMP_WORDS[COMP_CWORD]}"
895 --all --author= --signoff --verify --no-verify
896 --edit --amend --include --only --interactive
905 local cur
="${COMP_WORDS[COMP_CWORD]}"
909 --all --tags --contains --abbrev= --candidates=
910 --exact-match --debug --long --match --always
914 __gitcomp
"$(__git_refs)"
917 __git_diff_common_options
="--stat --numstat --shortstat --summary
918 --patch-with-stat --name-only --name-status --color
919 --no-color --color-words --no-renames --check
920 --full-index --binary --abbrev --diff-filter=
922 --text --ignore-space-at-eol --ignore-space-change
923 --ignore-all-space --exit-code --quiet --ext-diff
925 --no-prefix --src-prefix= --dst-prefix=
926 --inter-hunk-context=
933 __git_has_doubledash
&& return
935 local cur
="${COMP_WORDS[COMP_CWORD]}"
938 __gitcomp
"--cached --staged --pickaxe-all --pickaxe-regex
939 --base --ours --theirs
940 $__git_diff_common_options
948 __git_mergetools_common
="diffuse ecmerge emerge kdiff3 meld opendiff
949 tkdiff vimdiff gvimdiff xxdiff araxis
954 local cur
="${COMP_WORDS[COMP_CWORD]}"
957 __gitcomp
"$__git_mergetools_common kompare" "" "${cur##--tool=}"
968 __git_fetch_options
="
969 --quiet --verbose --append --upload-pack --force --keep --depth=
975 local cur
="${COMP_WORDS[COMP_CWORD]}"
978 __gitcomp
"$__git_fetch_options"
982 __git_complete_remote_or_refspec
987 local cur
="${COMP_WORDS[COMP_CWORD]}"
992 " "" "${cur##--thread=}"
997 --stdout --attach --no-attach --thread --thread=
999 --numbered --start-number
1003 --in-reply-to= --cc=
1004 --full-index --binary
1007 --no-prefix --src-prefix= --dst-prefix=
1008 --inline --suffix= --ignore-if-in-upstream
1014 __git_complete_revlist
1019 local cur
="${COMP_WORDS[COMP_CWORD]}"
1023 --tags --root --unreachable --cache --no-reflogs --full
1024 --strict --verbose --lost-found
1034 local cur
="${COMP_WORDS[COMP_CWORD]}"
1037 __gitcomp
"--prune --aggressive"
1046 __git_has_doubledash
&& return
1048 local cur
="${COMP_WORDS[COMP_CWORD]}"
1053 --text --ignore-case --word-regexp --invert-match
1055 --extended-regexp --basic-regexp --fixed-strings
1056 --files-with-matches --name-only
1057 --files-without-match
1060 --and --or --not --all-match
1070 local cur
="${COMP_WORDS[COMP_CWORD]}"
1073 __gitcomp
"--all --info --man --web"
1077 __gitcomp
"$(__git_all_commands)
1078 attributes cli core-tutorial cvs-migration
1079 diffcore gitk glossary hooks ignore modules
1080 repository-layout tutorial tutorial-2
1087 local cur
="${COMP_WORDS[COMP_CWORD]}"
1091 false true umask group all world everybody
1092 " "" "${cur##--shared=}"
1096 __gitcomp
"--quiet --bare --template= --shared --shared="
1105 __git_has_doubledash
&& return
1107 local cur
="${COMP_WORDS[COMP_CWORD]}"
1110 __gitcomp
"--cached --deleted --modified --others --ignored
1111 --stage --directory --no-empty-directory --unmerged
1112 --killed --exclude= --exclude-from=
1113 --exclude-per-directory= --exclude-standard
1114 --error-unmatch --with-tree= --full-name
1115 --abbrev --ignored --exclude-per-directory
1125 __gitcomp
"$(__git_remotes)"
1133 # Options that go well for log, shortlog and gitk
1134 __git_log_common_options
="
1136 --branches --tags --remotes
1137 --first-parent --merges --no-merges
1139 --max-age= --since= --after=
1140 --min-age= --until= --before=
1142 # Options that go well for log and gitk (not shortlog)
1143 __git_log_gitk_options
="
1144 --dense --sparse --full-history
1145 --simplify-merges --simplify-by-decoration
1148 # Options that go well for log and shortlog (not gitk)
1149 __git_log_shortlog_options
="
1150 --author= --committer= --grep=
1154 __git_log_pretty_formats
="oneline short medium full fuller email raw format:"
1155 __git_log_date_formats
="relative iso8601 rfc2822 short local default raw"
1159 __git_has_doubledash
&& return
1161 local cur
="${COMP_WORDS[COMP_CWORD]}"
1162 local g
="$(git rev-parse --git-dir 2>/dev/null)"
1164 if [ -f "$g/MERGE_HEAD" ]; then
1169 __gitcomp
"$__git_log_pretty_formats
1170 " "" "${cur##--pretty=}"
1174 __gitcomp
"$__git_log_pretty_formats
1175 " "" "${cur##--format=}"
1179 __gitcomp
"$__git_log_date_formats" "" "${cur##--date=}"
1184 $__git_log_common_options
1185 $__git_log_shortlog_options
1186 $__git_log_gitk_options
1187 --root --topo-order --date-order --reverse
1188 --follow --full-diff
1189 --abbrev-commit --abbrev=
1190 --relative-date --date=
1191 --pretty= --format= --oneline
1196 --parents --children
1198 $__git_diff_common_options
1199 --pickaxe-all --pickaxe-regex
1204 __git_complete_revlist
1207 __git_merge_options
="
1208 --no-commit --no-stat --log --no-log --squash --strategy
1209 --commit --stat --no-squash --ff --no-ff
1214 __git_complete_strategy
&& return
1216 local cur
="${COMP_WORDS[COMP_CWORD]}"
1219 __gitcomp
"$__git_merge_options"
1222 __gitcomp
"$(__git_refs)"
1227 local cur
="${COMP_WORDS[COMP_CWORD]}"
1230 __gitcomp
"$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1243 __gitcomp
"$(__git_refs)"
1248 local cur
="${COMP_WORDS[COMP_CWORD]}"
1251 __gitcomp
"--dry-run"
1260 __gitcomp
"--tags --all --stdin"
1265 __git_complete_strategy
&& return
1267 local cur
="${COMP_WORDS[COMP_CWORD]}"
1271 --rebase --no-rebase
1272 $__git_merge_options
1273 $__git_fetch_options
1278 __git_complete_remote_or_refspec
1283 local cur
="${COMP_WORDS[COMP_CWORD]}"
1284 case "${COMP_WORDS[COMP_CWORD-1]}" in
1286 __gitcomp
"$(__git_remotes)"
1291 __gitcomp
"$(__git_remotes)" "" "${cur##--repo=}"
1296 --all --mirror --tags --dry-run --force --verbose
1297 --receive-pack= --repo=
1302 __git_complete_remote_or_refspec
1307 local cur
="${COMP_WORDS[COMP_CWORD]}" dir
="$(__gitdir)"
1308 if [ -d "$dir"/rebase-apply
] ||
[ -d "$dir"/rebase-merge
]; then
1309 __gitcomp
"--continue --skip --abort"
1312 __git_complete_strategy
&& return
1315 __gitcomp
"--onto --merge --strategy --interactive"
1318 __gitcomp
"$(__git_refs)"
1321 __git_send_email_confirm_options
="always never auto cc compose"
1322 __git_send_email_suppresscc_options
="author self cc bodycc sob cccmd body all"
1326 local cur
="${COMP_WORDS[COMP_CWORD]}"
1330 $__git_send_email_confirm_options
1331 " "" "${cur##--confirm=}"
1336 $__git_send_email_suppresscc_options
1337 " "" "${cur##--suppress-cc=}"
1341 --smtp-encryption=*)
1342 __gitcomp
"ssl tls" "" "${cur##--smtp-encryption=}"
1346 __gitcomp
"--annotate --bcc --cc --cc-cmd --chain-reply-to
1347 --compose --confirm= --dry-run --envelope-sender
1349 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1350 --no-suppress-from --no-thread --quiet
1351 --signed-off-by-cc --smtp-pass --smtp-server
1352 --smtp-server-port --smtp-encryption= --smtp-user
1353 --subject --suppress-cc= --suppress-from --thread --to
1354 --validate --no-validate"
1361 __git_config_get_set_variables
()
1363 local prevword word config_file
= c
=$COMP_CWORD
1364 while [ $c -gt 1 ]; do
1365 word
="${COMP_WORDS[c]}"
1367 --global|
--system|
--file=*)
1372 config_file
="$word $prevword"
1380 git
--git-dir="$(__gitdir)" config
$config_file --list 2>/dev
/null |
1393 local cur
="${COMP_WORDS[COMP_CWORD]}"
1394 local prv
="${COMP_WORDS[COMP_CWORD-1]}"
1397 __gitcomp
"$(__git_remotes)"
1401 __gitcomp
"$(__git_refs)"
1405 local remote
="${prv#remote.}"
1406 remote
="${remote%.fetch}"
1407 __gitcomp
"$(__git_refs_remotes "$remote")"
1411 local remote
="${prv#remote.}"
1412 remote
="${remote%.push}"
1413 __gitcomp
"$(git --git-dir="$
(__gitdir
)" \
1414 for-each-ref --format='%(refname):%(refname)' \
1418 pull.twohead|pull.octopus
)
1419 __gitcomp
"$(__git_merge_strategies)"
1422 color.branch|color.
diff|color.interactive|\
1423 color.showbranch|color.status|color.ui
)
1424 __gitcomp
"always never auto"
1428 __gitcomp
"false true"
1433 normal black red green yellow blue magenta cyan white
1434 bold dim ul blink reverse
1439 __gitcomp
"man info web html"
1443 __gitcomp
"$__git_log_date_formats"
1446 sendemail.aliasesfiletype
)
1447 __gitcomp
"mutt mailrc pine elm gnus"
1451 __gitcomp
"$__git_send_email_confirm_options"
1454 sendemail.suppresscc
)
1455 __gitcomp
"$__git_send_email_suppresscc_options"
1458 --get|
--get-all|
--unset|
--unset-all)
1459 __gitcomp
"$(__git_config_get_set_variables)"
1470 --global --system --file=
1471 --list --replace-all
1472 --get --get-all --get-regexp
1473 --add --unset --unset-all
1474 --remove-section --rename-section
1479 local pfx
="${cur%.*}."
1481 __gitcomp
"remote merge mergeoptions rebase" "$pfx" "$cur"
1485 local pfx
="${cur%.*}."
1487 __gitcomp
"$(__git_heads)" "$pfx" "$cur" "."
1491 local pfx
="${cur%.*}."
1494 argprompt cmd confirm needsfile noconsole norescan
1495 prompt revprompt revunmerged title
1500 local pfx
="${cur%.*}."
1502 __gitcomp
"cmd path" "$pfx" "$cur"
1506 local pfx
="${cur%.*}."
1508 __gitcomp
"cmd path" "$pfx" "$cur"
1512 local pfx
="${cur%.*}."
1514 __gitcomp
"cmd path trustExitCode" "$pfx" "$cur"
1518 local pfx
="${cur%.*}."
1520 __gitcomp
"$(__git_all_commands)" "$pfx" "$cur"
1524 local pfx
="${cur%.*}."
1527 url proxy fetch push mirror skipDefaultUpdate
1528 receivepack uploadpack tagopt pushurl
1533 local pfx
="${cur%.*}."
1535 __gitcomp
"$(__git_remotes)" "$pfx" "$cur" "."
1539 local pfx
="${cur%.*}."
1541 __gitcomp
"insteadOf pushInsteadOf" "$pfx" "$cur"
1548 apply.ignorewhitespace
1550 branch.autosetupmerge
1551 branch.autosetuprebase
1554 color.branch.current
1565 color.diff.whitespace
1570 color.interactive.header
1571 color.interactive.help
1572 color.interactive.prompt
1577 color.status.changed
1579 color.status.nobranch
1580 color.status.untracked
1581 color.status.updated
1588 core.deltaBaseCacheLimit
1592 core.fsyncobjectfiles
1594 core.ignoreCygwinFSTricks
1596 core.logAllRefUpdates
1597 core.loosecompression
1599 core.packedGitWindowSize
1601 core.preferSymlinkRefs
1604 core.repositoryFormatVersion
1606 core.sharedRepository
1609 core.warnAmbiguousRefs
1612 diff.autorefreshindex
1618 diff.suppressBlankEmpty
1630 format.subjectprefix
1639 gc.reflogexpireunreachable
1643 gitcvs.commitmsgannotation
1644 gitcvs.dbTableNamePrefix
1655 gui.copyblamethreshold
1659 gui.matchtrackingbranch
1660 gui.newbranchtemplate
1661 gui.pruneduringfetch
1662 gui.spellingdictionary
1678 i18n.logOutputEncoding
1683 imap.preformattedHTML
1692 interactive.singlekey
1705 mergetool.keepBackup
1708 pack.deltaCacheLimit
1721 receive.denyCurrentBranch
1723 receive.denyNonFastForwards
1726 repack.usedeltabaseoffset
1729 sendemail.aliasesfile
1730 sendemail.aliasesfiletype
1734 sendemail.chainreplyto
1736 sendemail.envelopesender
1738 sendemail.signedoffbycc
1739 sendemail.smtpencryption
1741 sendemail.smtpserver
1742 sendemail.smtpserverport
1744 sendemail.suppresscc
1745 sendemail.suppressfrom
1750 status.relativePaths
1751 status.showUntrackedFiles
1753 transfer.unpackLimit
1765 local subcommands
="add rename rm show prune update set-head"
1766 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1767 if [ -z "$subcommand" ]; then
1768 __gitcomp
"$subcommands"
1772 case "$subcommand" in
1773 rename|
rm|show|prune
)
1774 __gitcomp
"$(__git_remotes)"
1777 local i c
='' IFS
=$
'\n'
1778 for i
in $
(git
--git-dir="$(__gitdir)" config
--get-regexp "remotes\..*" 2>/dev
/null
); do
1792 __git_has_doubledash
&& return
1794 local cur
="${COMP_WORDS[COMP_CWORD]}"
1797 __gitcomp
"--merge --mixed --hard --soft --patch"
1801 __gitcomp
"$(__git_refs)"
1806 local cur
="${COMP_WORDS[COMP_CWORD]}"
1809 __gitcomp
"--edit --mainline --no-edit --no-commit --signoff"
1813 __gitcomp
"$(__git_refs)"
1818 __git_has_doubledash
&& return
1820 local cur
="${COMP_WORDS[COMP_CWORD]}"
1823 __gitcomp
"--cached --dry-run --ignore-unmatch --quiet"
1832 __git_has_doubledash
&& return
1834 local cur
="${COMP_WORDS[COMP_CWORD]}"
1838 $__git_log_common_options
1839 $__git_log_shortlog_options
1840 --numbered --summary
1845 __git_complete_revlist
1850 __git_has_doubledash
&& return
1852 local cur
="${COMP_WORDS[COMP_CWORD]}"
1855 __gitcomp
"$__git_log_pretty_formats
1856 " "" "${cur##--pretty=}"
1860 __gitcomp
"$__git_log_pretty_formats
1861 " "" "${cur##--format=}"
1865 __gitcomp
"--pretty= --format= --abbrev-commit --oneline
1866 $__git_diff_common_options
1876 local cur
="${COMP_WORDS[COMP_CWORD]}"
1880 --all --remotes --topo-order --current --more=
1881 --list --independent --merge-base --no-name
1883 --sha1-name --sparse --topics --reflog
1888 __git_complete_revlist
1893 local cur
="${COMP_WORDS[COMP_CWORD]}"
1894 local save_opts
='--keep-index --no-keep-index --quiet --patch'
1895 local subcommands
='save list show apply clear drop pop create branch'
1896 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1897 if [ -z "$subcommand" ]; then
1900 __gitcomp
"$save_opts"
1903 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
1904 __gitcomp
"$subcommands"
1911 case "$subcommand,$cur" in
1913 __gitcomp
"$save_opts"
1916 __gitcomp
"--index --quiet"
1918 show
,--*|drop
,--*|branch
,--*)
1921 show
,*|apply
,*|drop
,*|pop
,*|branch
,*)
1922 __gitcomp
"$(git --git-dir="$
(__gitdir
)" stash list \
1923 | sed -n -e 's/:.*//p')"
1934 __git_has_doubledash
&& return
1936 local subcommands
="add status init update summary foreach sync"
1937 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
1938 local cur
="${COMP_WORDS[COMP_CWORD]}"
1941 __gitcomp
"--quiet --cached"
1944 __gitcomp
"$subcommands"
1954 init fetch clone rebase dcommit log find-rev
1955 set-tree commit-diff info create-ignore propget
1956 proplist show-ignore show-externals branch tag blame
1959 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1960 if [ -z "$subcommand" ]; then
1961 __gitcomp
"$subcommands"
1963 local remote_opts
="--username= --config-dir= --no-auth-cache"
1965 --follow-parent --authors-file= --repack=
1966 --no-metadata --use-svm-props --use-svnsync-props
1967 --log-window-size= --no-checkout --quiet
1968 --repack-flags --use-log-author --localtime
1969 --ignore-paths= $remote_opts
1972 --template= --shared= --trunk= --tags=
1973 --branches= --stdlayout --minimize-url
1974 --no-metadata --use-svm-props --use-svnsync-props
1975 --rewrite-root= --prefix= --use-log-author
1976 --add-author-from $remote_opts
1979 --edit --rmdir --find-copies-harder --copy-similarity=
1982 local cur
="${COMP_WORDS[COMP_CWORD]}"
1983 case "$subcommand,$cur" in
1985 __gitcomp
"--revision= --fetch-all $fc_opts"
1988 __gitcomp
"--revision= $fc_opts $init_opts"
1991 __gitcomp
"$init_opts"
1995 --merge --strategy= --verbose --dry-run
1996 --fetch-all --no-rebase --commit-url
1997 --revision $cmt_opts $fc_opts
2001 __gitcomp
"--stdin $cmt_opts $fc_opts"
2003 create-ignore
,--*|propget
,--*|proplist
,--*|show-ignore
,--*|\
2005 __gitcomp
"--revision="
2009 --limit= --revision= --verbose --incremental
2010 --oneline --show-commit --non-recursive
2011 --authors-file= --color
2016 --merge --verbose --strategy= --local
2017 --fetch-all --dry-run $fc_opts
2021 __gitcomp
"--message= --file= --revision= $cmt_opts"
2027 __gitcomp
"--dry-run --message --tag"
2030 __gitcomp
"--dry-run --message"
2033 __gitcomp
"--git-format"
2037 --config-dir= --ignore-paths= --minimize
2038 --no-auth-cache --username=
2051 while [ $c -lt $COMP_CWORD ]; do
2052 i
="${COMP_WORDS[c]}"
2055 __gitcomp
"$(__git_tags)"
2065 case "${COMP_WORDS[COMP_CWORD-1]}" in
2071 __gitcomp
"$(__git_tags)"
2077 __gitcomp
"$(__git_refs)"
2084 local i c
=1 command __git_dir
2086 while [ $c -lt $COMP_CWORD ]; do
2087 i
="${COMP_WORDS[c]}"
2089 --git-dir=*) __git_dir
="${i#--git-dir=}" ;;
2090 --bare) __git_dir
="." ;;
2091 --version|
-p|
--paginate) ;;
2092 --help) command="help"; break ;;
2093 *) command="$i"; break ;;
2098 if [ -z "$command" ]; then
2099 case "${COMP_WORDS[COMP_CWORD]}" in
2112 *) __gitcomp
"$(__git_porcelain_commands) $(__git_aliases)" ;;
2117 local expansion
=$
(__git_aliased_command
"$command")
2118 [ "$expansion" ] && command="$expansion"
2123 apply
) _git_apply
;;
2124 archive
) _git_archive
;;
2125 bisect
) _git_bisect
;;
2126 bundle
) _git_bundle
;;
2127 branch
) _git_branch
;;
2128 checkout
) _git_checkout
;;
2129 cherry
) _git_cherry
;;
2130 cherry-pick
) _git_cherry_pick
;;
2131 clean
) _git_clean
;;
2132 clone
) _git_clone
;;
2133 commit
) _git_commit
;;
2134 config
) _git_config
;;
2135 describe
) _git_describe
;;
2137 difftool
) _git_difftool
;;
2138 fetch
) _git_fetch
;;
2139 format-patch
) _git_format_patch
;;
2146 ls-files
) _git_ls_files
;;
2147 ls-remote
) _git_ls_remote
;;
2148 ls-tree
) _git_ls_tree
;;
2150 mergetool
) _git_mergetool
;;
2151 merge-base
) _git_merge_base
;;
2153 name-rev
) _git_name_rev
;;
2156 rebase
) _git_rebase
;;
2157 remote
) _git_remote
;;
2158 reset) _git_reset
;;
2159 revert
) _git_revert
;;
2161 send-email
) _git_send_email
;;
2162 shortlog
) _git_shortlog
;;
2164 show-branch
) _git_show_branch
;;
2165 stash
) _git_stash
;;
2167 submodule
) _git_submodule
;;
2170 whatchanged
) _git_log
;;
2177 __git_has_doubledash
&& return
2179 local cur
="${COMP_WORDS[COMP_CWORD]}"
2180 local g
="$(__gitdir)"
2182 if [ -f "$g/MERGE_HEAD" ]; then
2188 $__git_log_common_options
2189 $__git_log_gitk_options
2195 __git_complete_revlist
2198 complete
-o bashdefault
-o default
-o nospace
-F _git git
2>/dev
/null \
2199 || complete
-o default
-o nospace
-F _git git
2200 complete
-o bashdefault
-o default
-o nospace
-F _gitk gitk
2>/dev
/null \
2201 || complete
-o default
-o nospace
-F _gitk gitk
2203 # The following are necessary only for Cygwin, and only are needed
2204 # when the user has tab-completed the executable name and consequently
2205 # included the '.exe' suffix.
2207 if [ Cygwin
= "$(uname -o 2>/dev/null)" ]; then
2208 complete
-o bashdefault
-o default
-o nospace
-F _git git.exe
2>/dev
/null \
2209 || complete
-o default
-o nospace
-F _git git.exe