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.
49 # *) Read Documentation/SubmittingPatches
50 # *) Send all patches to the current maintainer:
52 # "Shawn O. Pearce" <spearce@spearce.org>
54 # *) Always CC the Git mailing list:
59 case "$COMP_WORDBREAKS" in
61 *) COMP_WORDBREAKS
="$COMP_WORDBREAKS:"
64 # __gitdir accepts 0 or 1 arguments (i.e., location)
65 # returns location of .git repo
68 if [ -z "${1-}" ]; then
69 if [ -n "${__git_dir-}" ]; then
71 elif [ -d .git
]; then
74 git rev-parse
--git-dir 2>/dev
/null
76 elif [ -d "$1/.git" ]; then
83 # __git_ps1 accepts 0 or 1 arguments (i.e., format string)
84 # returns text to add to bash PS1 prompt (includes branch name)
91 if [ -f "$g/rebase-merge/interactive" ]; then
93 b
="$(cat "$g/rebase-merge
/head-name
")"
94 elif [ -d "$g/rebase-merge" ]; then
96 b
="$(cat "$g/rebase-merge
/head-name
")"
98 if [ -d "$g/rebase-apply" ]; then
99 if [ -f "$g/rebase-apply/rebasing" ]; then
101 elif [ -f "$g/rebase-apply/applying" ]; then
106 elif [ -f "$g/MERGE_HEAD" ]; then
108 elif [ -f "$g/BISECT_LOG" ]; then
112 b
="$(git symbolic-ref HEAD 2>/dev/null)" ||
{
115 case "${GIT_PS1_DESCRIBE_STYLE-}" in
117 git describe --contains HEAD ;;
119 git describe --contains --all HEAD ;;
123 git describe --exact-match HEAD ;;
124 esac 2>/dev/null)" ||
126 b
="$(cut -c1-7 "$g/HEAD
" 2>/dev/null)..." ||
137 if [ "true" = "$(git rev-parse --is-inside-git-dir 2>/dev/null)" ]; then
138 if [ "true" = "$(git rev-parse --is-bare-repository 2>/dev/null)" ]; then
143 elif [ "true" = "$(git rev-parse --is-inside-work-tree 2>/dev/null)" ]; then
144 if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ]; then
145 if [ "$(git config --bool bash.showDirtyState)" != "false" ]; then
146 git
diff --no-ext-diff --ignore-submodules \
147 --quiet --exit-code || w
="*"
148 if git rev-parse
--quiet --verify HEAD
>/dev
/null
; then
149 git diff-index
--cached --quiet \
150 --ignore-submodules HEAD
-- || i
="+"
156 if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ]; then
157 git rev-parse
--verify refs
/stash
>/dev
/null
2>&1 && s
="$"
161 if [ -n "${1-}" ]; then
162 printf "$1" "$c${b##refs/heads/}$w$i$s$r"
164 printf " (%s)" "$c${b##refs/heads/}$w$i$s$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 if [ -e "$dir/HEAD" ]; then echo HEAD
; fi
254 format
="refname:short"
255 refs
="refs/tags refs/heads refs/remotes"
258 git
--git-dir="$dir" for-each-ref
--format="%($format)" \
262 for i
in $
(git ls-remote
"$dir" 2>/dev
/null
); do
263 case "$is_hash,$i" in
266 n
,refs
/tags
/*) is_hash
=y
; echo "${i#refs/tags/}" ;;
267 n
,refs
/heads
/*) is_hash
=y
; echo "${i#refs/heads/}" ;;
268 n
,refs
/remotes
/*) is_hash
=y
; echo "${i#refs/remotes/}" ;;
269 n
,*) is_hash
=y
; echo "$i" ;;
274 # __git_refs2 requires 1 argument (to pass to __git_refs)
278 for i
in $
(__git_refs
"$1"); do
283 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
284 __git_refs_remotes
()
286 local cmd i is_hash
=y
287 for i
in $
(git ls-remote
"$1" 2>/dev
/null
); do
288 case "$is_hash,$i" in
291 echo "$i:refs/remotes/$1/${i#refs/heads/}"
295 n
,refs
/tags
/*) is_hash
=y
;;
303 local i ngoff IFS
=$
'\n' d
="$(__gitdir)"
304 shopt -q nullglob || ngoff
=1
306 for i
in "$d/remotes"/*; do
307 echo ${i#$d/remotes/}
309 [ "$ngoff" ] && shopt -u nullglob
310 for i
in $
(git
--git-dir="$d" config
--list); do
320 __git_merge_strategies
()
322 if [ -n "${__git_merge_strategylist-}" ]; then
323 echo "$__git_merge_strategylist"
326 git merge
-s help 2>&1 |
327 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
335 __git_merge_strategylist
=
336 __git_merge_strategylist
=$
(__git_merge_strategies
2>/dev
/null
)
338 __git_complete_file
()
340 local pfx
ls ref cur
="${COMP_WORDS[COMP_CWORD]}"
357 case "$COMP_WORDBREAKS" in
359 *) pfx
="$ref:$pfx" ;;
363 COMPREPLY
=($
(compgen
-P "$pfx" \
364 -W "$(git --git-dir="$
(__gitdir
)" ls-tree "$ls" \
365 | sed '/^100... blob /{
381 __gitcomp
"$(__git_refs)"
386 __git_complete_revlist
()
388 local pfx cur
="${COMP_WORDS[COMP_CWORD]}"
393 __gitcomp
"$(__git_refs)" "$pfx" "$cur"
398 __gitcomp
"$(__git_refs)" "$pfx" "$cur"
401 __gitcomp
"$(__git_refs)"
406 __git_complete_remote_or_refspec
()
408 local cmd
="${COMP_WORDS[1]}"
409 local cur
="${COMP_WORDS[COMP_CWORD]}"
410 local i c
=2 remote
="" pfx
="" lhs
=1 no_complete_refspec
=0
411 while [ $c -lt $COMP_CWORD ]; do
414 --all|
--mirror) [ "$cmd" = "push" ] && no_complete_refspec
=1 ;;
416 *) remote
="$i"; break ;;
420 if [ -z "$remote" ]; then
421 __gitcomp
"$(__git_remotes)"
424 if [ $no_complete_refspec = 1 ]; then
428 [ "$remote" = "." ] && remote
=
431 case "$COMP_WORDBREAKS" in
433 *) pfx
="${cur%%:*}:" ;;
445 if [ $lhs = 1 ]; then
446 __gitcomp
"$(__git_refs2 "$remote")" "$pfx" "$cur"
448 __gitcomp
"$(__git_refs)" "$pfx" "$cur"
452 if [ $lhs = 1 ]; then
453 __gitcomp
"$(__git_refs "$remote")" "$pfx" "$cur"
455 __gitcomp
"$(__git_refs)" "$pfx" "$cur"
459 if [ $lhs = 1 ]; then
460 __gitcomp
"$(__git_refs)" "$pfx" "$cur"
462 __gitcomp
"$(__git_refs "$remote")" "$pfx" "$cur"
468 __git_complete_strategy
()
470 case "${COMP_WORDS[COMP_CWORD-1]}" in
472 __gitcomp
"$(__git_merge_strategies)"
475 local cur
="${COMP_WORDS[COMP_CWORD]}"
478 __gitcomp
"$(__git_merge_strategies)" "" "${cur##--strategy=}"
485 __git_all_commands
()
487 if [ -n "${__git_all_commandlist-}" ]; then
488 echo "$__git_all_commandlist"
492 for i
in $
(git
help -a|
egrep '^ ')
495 *--*) : helper pattern
;;
500 __git_all_commandlist
=
501 __git_all_commandlist
="$(__git_all_commands 2>/dev/null)"
503 __git_porcelain_commands
()
505 if [ -n "${__git_porcelain_commandlist-}" ]; then
506 echo "$__git_porcelain_commandlist"
510 for i
in "help" $
(__git_all_commands
)
513 *--*) : helper pattern
;;
514 applymbox
) : ask gittus
;;
515 applypatch
) : ask gittus
;;
516 archimport
) : import
;;
517 cat-file
) : plumbing
;;
518 check-attr
) : plumbing
;;
519 check-ref-format
) : plumbing
;;
520 checkout-index
) : plumbing
;;
521 commit-tree
) : plumbing
;;
522 count-objects
) : infrequent
;;
523 cvsexportcommit
) : export;;
524 cvsimport
) : import
;;
525 cvsserver
) : daemon
;;
527 diff-files
) : plumbing
;;
528 diff-index
) : plumbing
;;
529 diff-tree
) : plumbing
;;
530 fast-import
) : import
;;
531 fast-export
) : export;;
532 fsck-objects
) : plumbing
;;
533 fetch-pack
) : plumbing
;;
534 fmt-merge-msg
) : plumbing
;;
535 for-each-ref
) : plumbing
;;
536 hash-object
) : plumbing
;;
537 http-
*) : transport
;;
538 index-pack
) : plumbing
;;
539 init-db
) : deprecated
;;
540 local-fetch
) : plumbing
;;
541 lost-found
) : infrequent
;;
542 ls-files
) : plumbing
;;
543 ls-remote
) : plumbing
;;
544 ls-tree
) : plumbing
;;
545 mailinfo
) : plumbing
;;
546 mailsplit
) : plumbing
;;
547 merge-
*) : plumbing
;;
550 pack-objects
) : plumbing
;;
551 pack-redundant
) : plumbing
;;
552 pack-refs
) : plumbing
;;
553 parse-remote
) : plumbing
;;
554 patch-id
) : plumbing
;;
555 peek-remote
) : plumbing
;;
557 prune-packed
) : plumbing
;;
558 quiltimport
) : import
;;
559 read-tree
) : plumbing
;;
560 receive-pack
) : plumbing
;;
562 repo-config
) : deprecated
;;
564 rev-list
) : plumbing
;;
565 rev-parse
) : plumbing
;;
566 runstatus
) : plumbing
;;
567 sh-setup
) : internal
;;
569 show-ref
) : plumbing
;;
570 send-pack
) : plumbing
;;
571 show-index
) : plumbing
;;
573 stripspace
) : plumbing
;;
574 symbolic-ref
) : plumbing
;;
575 tar-tree
) : deprecated
;;
576 unpack-file
) : plumbing
;;
577 unpack-objects
) : plumbing
;;
578 update-index
) : plumbing
;;
579 update-ref
) : plumbing
;;
580 update-server-info
) : daemon
;;
581 upload-archive
) : plumbing
;;
582 upload-pack
) : plumbing
;;
583 write-tree
) : plumbing
;;
585 verify-pack
) : infrequent
;;
586 verify-tag
) : plumbing
;;
591 __git_porcelain_commandlist
=
592 __git_porcelain_commandlist
="$(__git_porcelain_commands 2>/dev/null)"
597 for i
in $
(git
--git-dir="$(__gitdir)" config
--list); do
607 # __git_aliased_command requires 1 argument
608 __git_aliased_command
()
610 local word cmdline
=$
(git
--git-dir="$(__gitdir)" \
611 config
--get "alias.$1")
612 for word
in $cmdline; do
613 if [ "${word##-*}" ]; then
620 # __git_find_subcommand requires 1 argument
621 __git_find_subcommand
()
623 local word subcommand c
=1
625 while [ $c -lt $COMP_CWORD ]; do
626 word
="${COMP_WORDS[c]}"
627 for subcommand
in $1; do
628 if [ "$subcommand" = "$word" ]; then
637 __git_has_doubledash
()
640 while [ $c -lt $COMP_CWORD ]; do
641 if [ "--" = "${COMP_WORDS[c]}" ]; then
649 __git_whitespacelist
="nowarn warn error error-all fix"
653 local cur
="${COMP_WORDS[COMP_CWORD]}" dir
="$(__gitdir)"
654 if [ -d "$dir"/rebase-apply
]; then
655 __gitcomp
"--skip --resolved --abort"
660 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
665 --3way --committer-date-is-author-date --ignore-date
666 --interactive --keep --no-utf8 --signoff --utf8
676 local cur
="${COMP_WORDS[COMP_CWORD]}"
679 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
684 --stat --numstat --summary --check --index
685 --cached --index-info --reverse --reject --unidiff-zero
686 --apply --no-add --exclude=
687 --whitespace= --inaccurate-eof --verbose
696 __git_has_doubledash
&& return
698 local cur
="${COMP_WORDS[COMP_CWORD]}"
702 --interactive --refresh --patch --update --dry-run
703 --ignore-errors --intent-to-add
712 local cur
="${COMP_WORDS[COMP_CWORD]}"
715 __gitcomp
"$(git archive --list)" "" "${cur##--format=}"
719 __gitcomp
"$(__git_remotes)" "" "${cur##--remote=}"
724 --format= --list --verbose
725 --prefix= --remote= --exec=
735 __git_has_doubledash
&& return
737 local subcommands
="start bad good skip reset visualize replay log run"
738 local subcommand
="$(__git_find_subcommand "$subcommands")"
739 if [ -z "$subcommand" ]; then
740 __gitcomp
"$subcommands"
744 case "$subcommand" in
746 __gitcomp
"$(__git_refs)"
756 local i c
=1 only_local_ref
="n" has_r
="n"
758 while [ $c -lt $COMP_CWORD ]; do
761 -d|
-m) only_local_ref
="y" ;;
767 case "${COMP_WORDS[COMP_CWORD]}" in
770 --color --no-color --verbose --abbrev= --no-abbrev
771 --track --no-track --contains --merged --no-merged
775 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
776 __gitcomp
"$(__git_heads)"
778 __gitcomp
"$(__git_refs)"
786 local cmd
="${COMP_WORDS[2]}"
787 case "$COMP_CWORD" in
789 __gitcomp
"create list-heads verify unbundle"
797 __git_complete_revlist
806 __git_has_doubledash
&& return
808 __gitcomp
"$(__git_refs)"
813 __gitcomp
"$(__git_refs)"
818 local cur
="${COMP_WORDS[COMP_CWORD]}"
821 __gitcomp
"--edit --no-commit"
824 __gitcomp
"$(__git_refs)"
831 __git_has_doubledash
&& return
833 local cur
="${COMP_WORDS[COMP_CWORD]}"
836 __gitcomp
"--dry-run --quiet"
845 local cur
="${COMP_WORDS[COMP_CWORD]}"
870 __git_has_doubledash
&& return
872 local cur
="${COMP_WORDS[COMP_CWORD]}"
876 --all --author= --signoff --verify --no-verify
877 --edit --amend --include --only --interactive
886 local cur
="${COMP_WORDS[COMP_CWORD]}"
890 --all --tags --contains --abbrev= --candidates=
891 --exact-match --debug --long --match --always
895 __gitcomp
"$(__git_refs)"
898 __git_diff_common_options
="--stat --numstat --shortstat --summary
899 --patch-with-stat --name-only --name-status --color
900 --no-color --color-words --no-renames --check
901 --full-index --binary --abbrev --diff-filter=
903 --text --ignore-space-at-eol --ignore-space-change
904 --ignore-all-space --exit-code --quiet --ext-diff
906 --no-prefix --src-prefix= --dst-prefix=
907 --inter-hunk-context=
914 __git_has_doubledash
&& return
916 local cur
="${COMP_WORDS[COMP_CWORD]}"
919 __gitcomp
"--cached --staged --pickaxe-all --pickaxe-regex
920 --base --ours --theirs
921 $__git_diff_common_options
929 __git_mergetools_common
="diffuse ecmerge emerge kdiff3 meld opendiff
930 tkdiff vimdiff gvimdiff xxdiff araxis
935 local cur
="${COMP_WORDS[COMP_CWORD]}"
938 __gitcomp
"$__git_mergetools_common kompare" "" "${cur##--tool=}"
949 __git_fetch_options
="
950 --quiet --verbose --append --upload-pack --force --keep --depth=
956 local cur
="${COMP_WORDS[COMP_CWORD]}"
959 __gitcomp
"$__git_fetch_options"
963 __git_complete_remote_or_refspec
968 local cur
="${COMP_WORDS[COMP_CWORD]}"
973 " "" "${cur##--thread=}"
978 --stdout --attach --no-attach --thread --thread=
980 --numbered --start-number
985 --full-index --binary
988 --no-prefix --src-prefix= --dst-prefix=
989 --inline --suffix= --ignore-if-in-upstream
995 __git_complete_revlist
1000 local cur
="${COMP_WORDS[COMP_CWORD]}"
1004 --tags --root --unreachable --cache --no-reflogs --full
1005 --strict --verbose --lost-found
1015 local cur
="${COMP_WORDS[COMP_CWORD]}"
1018 __gitcomp
"--prune --aggressive"
1027 __git_has_doubledash
&& return
1029 local cur
="${COMP_WORDS[COMP_CWORD]}"
1034 --text --ignore-case --word-regexp --invert-match
1036 --extended-regexp --basic-regexp --fixed-strings
1037 --files-with-matches --name-only
1038 --files-without-match
1041 --and --or --not --all-match
1051 local cur
="${COMP_WORDS[COMP_CWORD]}"
1054 __gitcomp
"--all --info --man --web"
1058 __gitcomp
"$(__git_all_commands)
1059 attributes cli core-tutorial cvs-migration
1060 diffcore gitk glossary hooks ignore modules
1061 repository-layout tutorial tutorial-2
1068 local cur
="${COMP_WORDS[COMP_CWORD]}"
1072 false true umask group all world everybody
1073 " "" "${cur##--shared=}"
1077 __gitcomp
"--quiet --bare --template= --shared --shared="
1086 __git_has_doubledash
&& return
1088 local cur
="${COMP_WORDS[COMP_CWORD]}"
1091 __gitcomp
"--cached --deleted --modified --others --ignored
1092 --stage --directory --no-empty-directory --unmerged
1093 --killed --exclude= --exclude-from=
1094 --exclude-per-directory= --exclude-standard
1095 --error-unmatch --with-tree= --full-name
1096 --abbrev --ignored --exclude-per-directory
1106 __gitcomp
"$(__git_remotes)"
1114 # Options that go well for log, shortlog and gitk
1115 __git_log_common_options
="
1117 --branches --tags --remotes
1118 --first-parent --merges --no-merges
1120 --max-age= --since= --after=
1121 --min-age= --until= --before=
1123 # Options that go well for log and gitk (not shortlog)
1124 __git_log_gitk_options
="
1125 --dense --sparse --full-history
1126 --simplify-merges --simplify-by-decoration
1129 # Options that go well for log and shortlog (not gitk)
1130 __git_log_shortlog_options
="
1131 --author= --committer= --grep=
1135 __git_log_pretty_formats
="oneline short medium full fuller email raw format:"
1136 __git_log_date_formats
="relative iso8601 rfc2822 short local default raw"
1140 __git_has_doubledash
&& return
1142 local cur
="${COMP_WORDS[COMP_CWORD]}"
1143 local g
="$(git rev-parse --git-dir 2>/dev/null)"
1145 if [ -f "$g/MERGE_HEAD" ]; then
1150 __gitcomp
"$__git_log_pretty_formats
1151 " "" "${cur##--pretty=}"
1155 __gitcomp
"$__git_log_pretty_formats
1156 " "" "${cur##--format=}"
1160 __gitcomp
"$__git_log_date_formats" "" "${cur##--date=}"
1165 $__git_log_common_options
1166 $__git_log_shortlog_options
1167 $__git_log_gitk_options
1168 --root --topo-order --date-order --reverse
1169 --follow --full-diff
1170 --abbrev-commit --abbrev=
1171 --relative-date --date=
1172 --pretty= --format= --oneline
1177 --parents --children
1179 $__git_diff_common_options
1180 --pickaxe-all --pickaxe-regex
1185 __git_complete_revlist
1188 __git_merge_options
="
1189 --no-commit --no-stat --log --no-log --squash --strategy
1190 --commit --stat --no-squash --ff --no-ff
1195 __git_complete_strategy
&& return
1197 local cur
="${COMP_WORDS[COMP_CWORD]}"
1200 __gitcomp
"$__git_merge_options"
1203 __gitcomp
"$(__git_refs)"
1208 local cur
="${COMP_WORDS[COMP_CWORD]}"
1211 __gitcomp
"$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1224 __gitcomp
"$(__git_refs)"
1229 local cur
="${COMP_WORDS[COMP_CWORD]}"
1232 __gitcomp
"--dry-run"
1241 __gitcomp
"--tags --all --stdin"
1246 __git_complete_strategy
&& return
1248 local cur
="${COMP_WORDS[COMP_CWORD]}"
1252 --rebase --no-rebase
1253 $__git_merge_options
1254 $__git_fetch_options
1259 __git_complete_remote_or_refspec
1264 local cur
="${COMP_WORDS[COMP_CWORD]}"
1265 case "${COMP_WORDS[COMP_CWORD-1]}" in
1267 __gitcomp
"$(__git_remotes)"
1272 __gitcomp
"$(__git_remotes)" "" "${cur##--repo=}"
1277 --all --mirror --tags --dry-run --force --verbose
1278 --receive-pack= --repo=
1283 __git_complete_remote_or_refspec
1288 local cur
="${COMP_WORDS[COMP_CWORD]}" dir
="$(__gitdir)"
1289 if [ -d "$dir"/rebase-apply
] ||
[ -d "$dir"/rebase-merge
]; then
1290 __gitcomp
"--continue --skip --abort"
1293 __git_complete_strategy
&& return
1296 __gitcomp
"--onto --merge --strategy --interactive"
1299 __gitcomp
"$(__git_refs)"
1302 __git_send_email_confirm_options
="always never auto cc compose"
1303 __git_send_email_suppresscc_options
="author self cc bodycc sob cccmd body all"
1307 local cur
="${COMP_WORDS[COMP_CWORD]}"
1311 $__git_send_email_confirm_options
1312 " "" "${cur##--confirm=}"
1317 $__git_send_email_suppresscc_options
1318 " "" "${cur##--suppress-cc=}"
1322 --smtp-encryption=*)
1323 __gitcomp
"ssl tls" "" "${cur##--smtp-encryption=}"
1327 __gitcomp
"--annotate --bcc --cc --cc-cmd --chain-reply-to
1328 --compose --confirm= --dry-run --envelope-sender
1330 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1331 --no-suppress-from --no-thread --quiet
1332 --signed-off-by-cc --smtp-pass --smtp-server
1333 --smtp-server-port --smtp-encryption= --smtp-user
1334 --subject --suppress-cc= --suppress-from --thread --to
1335 --validate --no-validate"
1342 __git_config_get_set_variables
()
1344 local prevword word config_file
= c
=$COMP_CWORD
1345 while [ $c -gt 1 ]; do
1346 word
="${COMP_WORDS[c]}"
1348 --global|
--system|
--file=*)
1353 config_file
="$word $prevword"
1361 git
--git-dir="$(__gitdir)" config
$config_file --list 2>/dev
/null |
1374 local cur
="${COMP_WORDS[COMP_CWORD]}"
1375 local prv
="${COMP_WORDS[COMP_CWORD-1]}"
1378 __gitcomp
"$(__git_remotes)"
1382 __gitcomp
"$(__git_refs)"
1386 local remote
="${prv#remote.}"
1387 remote
="${remote%.fetch}"
1388 __gitcomp
"$(__git_refs_remotes "$remote")"
1392 local remote
="${prv#remote.}"
1393 remote
="${remote%.push}"
1394 __gitcomp
"$(git --git-dir="$
(__gitdir
)" \
1395 for-each-ref --format='%(refname):%(refname)' \
1399 pull.twohead|pull.octopus
)
1400 __gitcomp
"$(__git_merge_strategies)"
1403 color.branch|color.
diff|color.interactive|\
1404 color.showbranch|color.status|color.ui
)
1405 __gitcomp
"always never auto"
1409 __gitcomp
"false true"
1414 normal black red green yellow blue magenta cyan white
1415 bold dim ul blink reverse
1420 __gitcomp
"man info web html"
1424 __gitcomp
"$__git_log_date_formats"
1427 sendemail.aliasesfiletype
)
1428 __gitcomp
"mutt mailrc pine elm gnus"
1432 __gitcomp
"$__git_send_email_confirm_options"
1435 sendemail.suppresscc
)
1436 __gitcomp
"$__git_send_email_suppresscc_options"
1439 --get|
--get-all|
--unset|
--unset-all)
1440 __gitcomp
"$(__git_config_get_set_variables)"
1451 --global --system --file=
1452 --list --replace-all
1453 --get --get-all --get-regexp
1454 --add --unset --unset-all
1455 --remove-section --rename-section
1460 local pfx
="${cur%.*}."
1462 __gitcomp
"remote merge mergeoptions rebase" "$pfx" "$cur"
1466 local pfx
="${cur%.*}."
1468 __gitcomp
"$(__git_heads)" "$pfx" "$cur" "."
1472 local pfx
="${cur%.*}."
1475 argprompt cmd confirm needsfile noconsole norescan
1476 prompt revprompt revunmerged title
1481 local pfx
="${cur%.*}."
1483 __gitcomp
"cmd path" "$pfx" "$cur"
1487 local pfx
="${cur%.*}."
1489 __gitcomp
"cmd path" "$pfx" "$cur"
1493 local pfx
="${cur%.*}."
1495 __gitcomp
"cmd path trustExitCode" "$pfx" "$cur"
1499 local pfx
="${cur%.*}."
1501 __gitcomp
"$(__git_all_commands)" "$pfx" "$cur"
1505 local pfx
="${cur%.*}."
1508 url proxy fetch push mirror skipDefaultUpdate
1509 receivepack uploadpack tagopt pushurl
1514 local pfx
="${cur%.*}."
1516 __gitcomp
"$(__git_remotes)" "$pfx" "$cur" "."
1520 local pfx
="${cur%.*}."
1522 __gitcomp
"insteadof" "$pfx" "$cur"
1530 branch.autosetupmerge
1531 branch.autosetuprebase
1534 color.branch.current
1545 color.diff.whitespace
1550 color.interactive.header
1551 color.interactive.help
1552 color.interactive.prompt
1557 color.status.changed
1559 color.status.nobranch
1560 color.status.untracked
1561 color.status.updated
1568 core.deltaBaseCacheLimit
1572 core.fsyncobjectfiles
1574 core.ignoreCygwinFSTricks
1576 core.logAllRefUpdates
1577 core.loosecompression
1579 core.packedGitWindowSize
1581 core.preferSymlinkRefs
1584 core.repositoryFormatVersion
1586 core.sharedRepository
1589 core.warnAmbiguousRefs
1592 diff.autorefreshindex
1598 diff.suppressBlankEmpty
1610 format.subjectprefix
1619 gc.reflogexpireunreachable
1623 gitcvs.commitmsgannotation
1624 gitcvs.dbTableNamePrefix
1635 gui.copyblamethreshold
1639 gui.matchtrackingbranch
1640 gui.newbranchtemplate
1641 gui.pruneduringfetch
1642 gui.spellingdictionary
1658 i18n.logOutputEncoding
1663 imap.preformattedHTML
1672 interactive.singlekey
1685 mergetool.keepBackup
1688 pack.deltaCacheLimit
1701 receive.denyCurrentBranch
1703 receive.denyNonFastForwards
1706 repack.usedeltabaseoffset
1709 sendemail.aliasesfile
1710 sendemail.aliasesfiletype
1714 sendemail.chainreplyto
1716 sendemail.envelopesender
1718 sendemail.signedoffbycc
1719 sendemail.smtpencryption
1721 sendemail.smtpserver
1722 sendemail.smtpserverport
1724 sendemail.suppresscc
1725 sendemail.suppressfrom
1730 status.relativePaths
1731 status.showUntrackedFiles
1733 transfer.unpackLimit
1745 local subcommands
="add rename rm show prune update set-head"
1746 local subcommand
="$(__git_find_subcommand "$subcommands")"
1747 if [ -z "$subcommand" ]; then
1748 __gitcomp
"$subcommands"
1752 case "$subcommand" in
1753 rename|
rm|show|prune
)
1754 __gitcomp
"$(__git_remotes)"
1757 local i c
='' IFS
=$
'\n'
1758 for i
in $
(git
--git-dir="$(__gitdir)" config
--list); do
1776 __git_has_doubledash
&& return
1778 local cur
="${COMP_WORDS[COMP_CWORD]}"
1781 __gitcomp
"--merge --mixed --hard --soft"
1785 __gitcomp
"$(__git_refs)"
1790 local cur
="${COMP_WORDS[COMP_CWORD]}"
1793 __gitcomp
"--edit --mainline --no-edit --no-commit --signoff"
1797 __gitcomp
"$(__git_refs)"
1802 __git_has_doubledash
&& return
1804 local cur
="${COMP_WORDS[COMP_CWORD]}"
1807 __gitcomp
"--cached --dry-run --ignore-unmatch --quiet"
1816 __git_has_doubledash
&& return
1818 local cur
="${COMP_WORDS[COMP_CWORD]}"
1822 $__git_log_common_options
1823 $__git_log_shortlog_options
1824 --numbered --summary
1829 __git_complete_revlist
1834 __git_has_doubledash
&& return
1836 local cur
="${COMP_WORDS[COMP_CWORD]}"
1839 __gitcomp
"$__git_log_pretty_formats
1840 " "" "${cur##--pretty=}"
1844 __gitcomp
"$__git_log_pretty_formats
1845 " "" "${cur##--format=}"
1849 __gitcomp
"--pretty= --format= --abbrev-commit --oneline
1850 $__git_diff_common_options
1860 local cur
="${COMP_WORDS[COMP_CWORD]}"
1864 --all --remotes --topo-order --current --more=
1865 --list --independent --merge-base --no-name
1867 --sha1-name --sparse --topics --reflog
1872 __git_complete_revlist
1877 local subcommands
='save list show apply clear drop pop create branch'
1878 local subcommand
="$(__git_find_subcommand "$subcommands")"
1879 if [ -z "$subcommand" ]; then
1880 __gitcomp
"$subcommands"
1882 local cur
="${COMP_WORDS[COMP_CWORD]}"
1883 case "$subcommand,$cur" in
1885 __gitcomp
"--keep-index"
1890 show
,--*|drop
,--*|branch
,--*)
1893 show
,*|apply
,*|drop
,*|pop
,*|branch
,*)
1894 __gitcomp
"$(git --git-dir="$
(__gitdir
)" stash list \
1895 | sed -n -e 's/:.*//p')"
1906 __git_has_doubledash
&& return
1908 local subcommands
="add status init update summary foreach sync"
1909 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1910 local cur
="${COMP_WORDS[COMP_CWORD]}"
1913 __gitcomp
"--quiet --cached"
1916 __gitcomp
"$subcommands"
1926 init fetch clone rebase dcommit log find-rev
1927 set-tree commit-diff info create-ignore propget
1928 proplist show-ignore show-externals branch tag blame
1931 local subcommand
="$(__git_find_subcommand "$subcommands")"
1932 if [ -z "$subcommand" ]; then
1933 __gitcomp
"$subcommands"
1935 local remote_opts
="--username= --config-dir= --no-auth-cache"
1937 --follow-parent --authors-file= --repack=
1938 --no-metadata --use-svm-props --use-svnsync-props
1939 --log-window-size= --no-checkout --quiet
1940 --repack-flags --use-log-author --localtime
1941 --ignore-paths= $remote_opts
1944 --template= --shared= --trunk= --tags=
1945 --branches= --stdlayout --minimize-url
1946 --no-metadata --use-svm-props --use-svnsync-props
1947 --rewrite-root= --prefix= --use-log-author
1948 --add-author-from $remote_opts
1951 --edit --rmdir --find-copies-harder --copy-similarity=
1954 local cur
="${COMP_WORDS[COMP_CWORD]}"
1955 case "$subcommand,$cur" in
1957 __gitcomp
"--revision= --fetch-all $fc_opts"
1960 __gitcomp
"--revision= $fc_opts $init_opts"
1963 __gitcomp
"$init_opts"
1967 --merge --strategy= --verbose --dry-run
1968 --fetch-all --no-rebase --commit-url
1969 --revision $cmt_opts $fc_opts
1973 __gitcomp
"--stdin $cmt_opts $fc_opts"
1975 create-ignore
,--*|propget
,--*|proplist
,--*|show-ignore
,--*|\
1977 __gitcomp
"--revision="
1981 --limit= --revision= --verbose --incremental
1982 --oneline --show-commit --non-recursive
1983 --authors-file= --color
1988 --merge --verbose --strategy= --local
1989 --fetch-all --dry-run $fc_opts
1993 __gitcomp
"--message= --file= --revision= $cmt_opts"
1999 __gitcomp
"--dry-run --message --tag"
2002 __gitcomp
"--dry-run --message"
2005 __gitcomp
"--git-format"
2009 --config-dir= --ignore-paths= --minimize
2010 --no-auth-cache --username=
2023 while [ $c -lt $COMP_CWORD ]; do
2024 i
="${COMP_WORDS[c]}"
2027 __gitcomp
"$(__git_tags)"
2037 case "${COMP_WORDS[COMP_CWORD-1]}" in
2043 __gitcomp
"$(__git_tags)"
2049 __gitcomp
"$(__git_refs)"
2056 local i c
=1 command __git_dir
2058 while [ $c -lt $COMP_CWORD ]; do
2059 i
="${COMP_WORDS[c]}"
2061 --git-dir=*) __git_dir
="${i#--git-dir=}" ;;
2062 --bare) __git_dir
="." ;;
2063 --version|
-p|
--paginate) ;;
2064 --help) command="help"; break ;;
2065 *) command="$i"; break ;;
2070 if [ -z "$command" ]; then
2071 case "${COMP_WORDS[COMP_CWORD]}" in
2084 *) __gitcomp
"$(__git_porcelain_commands) $(__git_aliases)" ;;
2089 local expansion
=$
(__git_aliased_command
"$command")
2090 [ "$expansion" ] && command="$expansion"
2095 apply
) _git_apply
;;
2096 archive
) _git_archive
;;
2097 bisect
) _git_bisect
;;
2098 bundle
) _git_bundle
;;
2099 branch
) _git_branch
;;
2100 checkout
) _git_checkout
;;
2101 cherry
) _git_cherry
;;
2102 cherry-pick
) _git_cherry_pick
;;
2103 clean
) _git_clean
;;
2104 clone
) _git_clone
;;
2105 commit
) _git_commit
;;
2106 config
) _git_config
;;
2107 describe
) _git_describe
;;
2109 difftool
) _git_difftool
;;
2110 fetch
) _git_fetch
;;
2111 format-patch
) _git_format_patch
;;
2118 ls-files
) _git_ls_files
;;
2119 ls-remote
) _git_ls_remote
;;
2120 ls-tree
) _git_ls_tree
;;
2122 mergetool
) _git_mergetool
;;
2123 merge-base
) _git_merge_base
;;
2125 name-rev
) _git_name_rev
;;
2128 rebase
) _git_rebase
;;
2129 remote
) _git_remote
;;
2130 reset) _git_reset
;;
2131 revert
) _git_revert
;;
2133 send-email
) _git_send_email
;;
2134 shortlog
) _git_shortlog
;;
2136 show-branch
) _git_show_branch
;;
2137 stash
) _git_stash
;;
2139 submodule
) _git_submodule
;;
2142 whatchanged
) _git_log
;;
2149 __git_has_doubledash
&& return
2151 local cur
="${COMP_WORDS[COMP_CWORD]}"
2152 local g
="$(__gitdir)"
2154 if [ -f "$g/MERGE_HEAD" ]; then
2160 $__git_log_common_options
2161 $__git_log_gitk_options
2167 __git_complete_revlist
2170 complete
-o bashdefault
-o default
-o nospace
-F _git git
2>/dev
/null \
2171 || complete
-o default
-o nospace
-F _git git
2172 complete
-o bashdefault
-o default
-o nospace
-F _gitk gitk
2>/dev
/null \
2173 || complete
-o default
-o nospace
-F _gitk gitk
2175 # The following are necessary only for Cygwin, and only are needed
2176 # when the user has tab-completed the executable name and consequently
2177 # included the '.exe' suffix.
2179 if [ Cygwin
= "$(uname -o 2>/dev/null)" ]; then
2180 complete
-o bashdefault
-o default
-o nospace
-F _git git.exe
2>/dev
/null \
2181 || complete
-o default
-o nospace
-F _git git.exe