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 __gitcomp
"$(__git_refs)"
818 __gitcomp
"$(__git_refs)"
823 local cur
="${COMP_WORDS[COMP_CWORD]}"
826 __gitcomp
"--edit --no-commit"
829 __gitcomp
"$(__git_refs)"
836 __git_has_doubledash
&& return
838 local cur
="${COMP_WORDS[COMP_CWORD]}"
841 __gitcomp
"--dry-run --quiet"
850 local cur
="${COMP_WORDS[COMP_CWORD]}"
875 __git_has_doubledash
&& return
877 local cur
="${COMP_WORDS[COMP_CWORD]}"
881 --all --author= --signoff --verify --no-verify
882 --edit --amend --include --only --interactive
891 local cur
="${COMP_WORDS[COMP_CWORD]}"
895 --all --tags --contains --abbrev= --candidates=
896 --exact-match --debug --long --match --always
900 __gitcomp
"$(__git_refs)"
903 __git_diff_common_options
="--stat --numstat --shortstat --summary
904 --patch-with-stat --name-only --name-status --color
905 --no-color --color-words --no-renames --check
906 --full-index --binary --abbrev --diff-filter=
908 --text --ignore-space-at-eol --ignore-space-change
909 --ignore-all-space --exit-code --quiet --ext-diff
911 --no-prefix --src-prefix= --dst-prefix=
912 --inter-hunk-context=
919 __git_has_doubledash
&& return
921 local cur
="${COMP_WORDS[COMP_CWORD]}"
924 __gitcomp
"--cached --staged --pickaxe-all --pickaxe-regex
925 --base --ours --theirs
926 $__git_diff_common_options
934 __git_mergetools_common
="diffuse ecmerge emerge kdiff3 meld opendiff
935 tkdiff vimdiff gvimdiff xxdiff araxis
940 local cur
="${COMP_WORDS[COMP_CWORD]}"
943 __gitcomp
"$__git_mergetools_common kompare" "" "${cur##--tool=}"
954 __git_fetch_options
="
955 --quiet --verbose --append --upload-pack --force --keep --depth=
961 local cur
="${COMP_WORDS[COMP_CWORD]}"
964 __gitcomp
"$__git_fetch_options"
968 __git_complete_remote_or_refspec
973 local cur
="${COMP_WORDS[COMP_CWORD]}"
978 " "" "${cur##--thread=}"
983 --stdout --attach --no-attach --thread --thread=
985 --numbered --start-number
990 --full-index --binary
993 --no-prefix --src-prefix= --dst-prefix=
994 --inline --suffix= --ignore-if-in-upstream
1000 __git_complete_revlist
1005 local cur
="${COMP_WORDS[COMP_CWORD]}"
1009 --tags --root --unreachable --cache --no-reflogs --full
1010 --strict --verbose --lost-found
1020 local cur
="${COMP_WORDS[COMP_CWORD]}"
1023 __gitcomp
"--prune --aggressive"
1032 __git_has_doubledash
&& return
1034 local cur
="${COMP_WORDS[COMP_CWORD]}"
1039 --text --ignore-case --word-regexp --invert-match
1041 --extended-regexp --basic-regexp --fixed-strings
1042 --files-with-matches --name-only
1043 --files-without-match
1046 --and --or --not --all-match
1056 local cur
="${COMP_WORDS[COMP_CWORD]}"
1059 __gitcomp
"--all --info --man --web"
1063 __gitcomp
"$(__git_all_commands)
1064 attributes cli core-tutorial cvs-migration
1065 diffcore gitk glossary hooks ignore modules
1066 repository-layout tutorial tutorial-2
1073 local cur
="${COMP_WORDS[COMP_CWORD]}"
1077 false true umask group all world everybody
1078 " "" "${cur##--shared=}"
1082 __gitcomp
"--quiet --bare --template= --shared --shared="
1091 __git_has_doubledash
&& return
1093 local cur
="${COMP_WORDS[COMP_CWORD]}"
1096 __gitcomp
"--cached --deleted --modified --others --ignored
1097 --stage --directory --no-empty-directory --unmerged
1098 --killed --exclude= --exclude-from=
1099 --exclude-per-directory= --exclude-standard
1100 --error-unmatch --with-tree= --full-name
1101 --abbrev --ignored --exclude-per-directory
1111 __gitcomp
"$(__git_remotes)"
1119 # Options that go well for log, shortlog and gitk
1120 __git_log_common_options
="
1122 --branches --tags --remotes
1123 --first-parent --merges --no-merges
1125 --max-age= --since= --after=
1126 --min-age= --until= --before=
1128 # Options that go well for log and gitk (not shortlog)
1129 __git_log_gitk_options
="
1130 --dense --sparse --full-history
1131 --simplify-merges --simplify-by-decoration
1134 # Options that go well for log and shortlog (not gitk)
1135 __git_log_shortlog_options
="
1136 --author= --committer= --grep=
1140 __git_log_pretty_formats
="oneline short medium full fuller email raw format:"
1141 __git_log_date_formats
="relative iso8601 rfc2822 short local default raw"
1145 __git_has_doubledash
&& return
1147 local cur
="${COMP_WORDS[COMP_CWORD]}"
1148 local g
="$(git rev-parse --git-dir 2>/dev/null)"
1150 if [ -f "$g/MERGE_HEAD" ]; then
1155 __gitcomp
"$__git_log_pretty_formats
1156 " "" "${cur##--pretty=}"
1160 __gitcomp
"$__git_log_pretty_formats
1161 " "" "${cur##--format=}"
1165 __gitcomp
"$__git_log_date_formats" "" "${cur##--date=}"
1170 $__git_log_common_options
1171 $__git_log_shortlog_options
1172 $__git_log_gitk_options
1173 --root --topo-order --date-order --reverse
1174 --follow --full-diff
1175 --abbrev-commit --abbrev=
1176 --relative-date --date=
1177 --pretty= --format= --oneline
1182 --parents --children
1184 $__git_diff_common_options
1185 --pickaxe-all --pickaxe-regex
1190 __git_complete_revlist
1193 __git_merge_options
="
1194 --no-commit --no-stat --log --no-log --squash --strategy
1195 --commit --stat --no-squash --ff --no-ff
1200 __git_complete_strategy
&& return
1202 local cur
="${COMP_WORDS[COMP_CWORD]}"
1205 __gitcomp
"$__git_merge_options"
1208 __gitcomp
"$(__git_refs)"
1213 local cur
="${COMP_WORDS[COMP_CWORD]}"
1216 __gitcomp
"$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1229 __gitcomp
"$(__git_refs)"
1234 local cur
="${COMP_WORDS[COMP_CWORD]}"
1237 __gitcomp
"--dry-run"
1246 __gitcomp
"--tags --all --stdin"
1251 __git_complete_strategy
&& return
1253 local cur
="${COMP_WORDS[COMP_CWORD]}"
1257 --rebase --no-rebase
1258 $__git_merge_options
1259 $__git_fetch_options
1264 __git_complete_remote_or_refspec
1269 local cur
="${COMP_WORDS[COMP_CWORD]}"
1270 case "${COMP_WORDS[COMP_CWORD-1]}" in
1272 __gitcomp
"$(__git_remotes)"
1277 __gitcomp
"$(__git_remotes)" "" "${cur##--repo=}"
1282 --all --mirror --tags --dry-run --force --verbose
1283 --receive-pack= --repo=
1288 __git_complete_remote_or_refspec
1293 local cur
="${COMP_WORDS[COMP_CWORD]}" dir
="$(__gitdir)"
1294 if [ -d "$dir"/rebase-apply
] ||
[ -d "$dir"/rebase-merge
]; then
1295 __gitcomp
"--continue --skip --abort"
1298 __git_complete_strategy
&& return
1301 __gitcomp
"--onto --merge --strategy --interactive"
1304 __gitcomp
"$(__git_refs)"
1307 __git_send_email_confirm_options
="always never auto cc compose"
1308 __git_send_email_suppresscc_options
="author self cc bodycc sob cccmd body all"
1312 local cur
="${COMP_WORDS[COMP_CWORD]}"
1316 $__git_send_email_confirm_options
1317 " "" "${cur##--confirm=}"
1322 $__git_send_email_suppresscc_options
1323 " "" "${cur##--suppress-cc=}"
1327 --smtp-encryption=*)
1328 __gitcomp
"ssl tls" "" "${cur##--smtp-encryption=}"
1332 __gitcomp
"--annotate --bcc --cc --cc-cmd --chain-reply-to
1333 --compose --confirm= --dry-run --envelope-sender
1335 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1336 --no-suppress-from --no-thread --quiet
1337 --signed-off-by-cc --smtp-pass --smtp-server
1338 --smtp-server-port --smtp-encryption= --smtp-user
1339 --subject --suppress-cc= --suppress-from --thread --to
1340 --validate --no-validate"
1347 __git_config_get_set_variables
()
1349 local prevword word config_file
= c
=$COMP_CWORD
1350 while [ $c -gt 1 ]; do
1351 word
="${COMP_WORDS[c]}"
1353 --global|
--system|
--file=*)
1358 config_file
="$word $prevword"
1366 git
--git-dir="$(__gitdir)" config
$config_file --list 2>/dev
/null |
1379 local cur
="${COMP_WORDS[COMP_CWORD]}"
1380 local prv
="${COMP_WORDS[COMP_CWORD-1]}"
1383 __gitcomp
"$(__git_remotes)"
1387 __gitcomp
"$(__git_refs)"
1391 local remote
="${prv#remote.}"
1392 remote
="${remote%.fetch}"
1393 __gitcomp
"$(__git_refs_remotes "$remote")"
1397 local remote
="${prv#remote.}"
1398 remote
="${remote%.push}"
1399 __gitcomp
"$(git --git-dir="$
(__gitdir
)" \
1400 for-each-ref --format='%(refname):%(refname)' \
1404 pull.twohead|pull.octopus
)
1405 __gitcomp
"$(__git_merge_strategies)"
1408 color.branch|color.
diff|color.interactive|\
1409 color.showbranch|color.status|color.ui
)
1410 __gitcomp
"always never auto"
1414 __gitcomp
"false true"
1419 normal black red green yellow blue magenta cyan white
1420 bold dim ul blink reverse
1425 __gitcomp
"man info web html"
1429 __gitcomp
"$__git_log_date_formats"
1432 sendemail.aliasesfiletype
)
1433 __gitcomp
"mutt mailrc pine elm gnus"
1437 __gitcomp
"$__git_send_email_confirm_options"
1440 sendemail.suppresscc
)
1441 __gitcomp
"$__git_send_email_suppresscc_options"
1444 --get|
--get-all|
--unset|
--unset-all)
1445 __gitcomp
"$(__git_config_get_set_variables)"
1456 --global --system --file=
1457 --list --replace-all
1458 --get --get-all --get-regexp
1459 --add --unset --unset-all
1460 --remove-section --rename-section
1465 local pfx
="${cur%.*}."
1467 __gitcomp
"remote merge mergeoptions rebase" "$pfx" "$cur"
1471 local pfx
="${cur%.*}."
1473 __gitcomp
"$(__git_heads)" "$pfx" "$cur" "."
1477 local pfx
="${cur%.*}."
1480 argprompt cmd confirm needsfile noconsole norescan
1481 prompt revprompt revunmerged title
1486 local pfx
="${cur%.*}."
1488 __gitcomp
"cmd path" "$pfx" "$cur"
1492 local pfx
="${cur%.*}."
1494 __gitcomp
"cmd path" "$pfx" "$cur"
1498 local pfx
="${cur%.*}."
1500 __gitcomp
"cmd path trustExitCode" "$pfx" "$cur"
1504 local pfx
="${cur%.*}."
1506 __gitcomp
"$(__git_all_commands)" "$pfx" "$cur"
1510 local pfx
="${cur%.*}."
1513 url proxy fetch push mirror skipDefaultUpdate
1514 receivepack uploadpack tagopt pushurl
1519 local pfx
="${cur%.*}."
1521 __gitcomp
"$(__git_remotes)" "$pfx" "$cur" "."
1525 local pfx
="${cur%.*}."
1527 __gitcomp
"insteadOf pushInsteadOf" "$pfx" "$cur"
1534 apply.ignorewhitespace
1536 branch.autosetupmerge
1537 branch.autosetuprebase
1540 color.branch.current
1551 color.diff.whitespace
1556 color.interactive.header
1557 color.interactive.help
1558 color.interactive.prompt
1563 color.status.changed
1565 color.status.nobranch
1566 color.status.untracked
1567 color.status.updated
1574 core.deltaBaseCacheLimit
1578 core.fsyncobjectfiles
1580 core.ignoreCygwinFSTricks
1582 core.logAllRefUpdates
1583 core.loosecompression
1585 core.packedGitWindowSize
1587 core.preferSymlinkRefs
1590 core.repositoryFormatVersion
1592 core.sharedRepository
1595 core.warnAmbiguousRefs
1598 diff.autorefreshindex
1604 diff.suppressBlankEmpty
1616 format.subjectprefix
1625 gc.reflogexpireunreachable
1629 gitcvs.commitmsgannotation
1630 gitcvs.dbTableNamePrefix
1641 gui.copyblamethreshold
1645 gui.matchtrackingbranch
1646 gui.newbranchtemplate
1647 gui.pruneduringfetch
1648 gui.spellingdictionary
1664 i18n.logOutputEncoding
1669 imap.preformattedHTML
1678 interactive.singlekey
1691 mergetool.keepBackup
1694 pack.deltaCacheLimit
1707 receive.denyCurrentBranch
1709 receive.denyNonFastForwards
1712 repack.usedeltabaseoffset
1715 sendemail.aliasesfile
1716 sendemail.aliasesfiletype
1720 sendemail.chainreplyto
1722 sendemail.envelopesender
1724 sendemail.signedoffbycc
1725 sendemail.smtpencryption
1727 sendemail.smtpserver
1728 sendemail.smtpserverport
1730 sendemail.suppresscc
1731 sendemail.suppressfrom
1736 status.relativePaths
1737 status.showUntrackedFiles
1739 transfer.unpackLimit
1751 local subcommands
="add rename rm show prune update set-head"
1752 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1753 if [ -z "$subcommand" ]; then
1754 __gitcomp
"$subcommands"
1758 case "$subcommand" in
1759 rename|
rm|show|prune
)
1760 __gitcomp
"$(__git_remotes)"
1763 local i c
='' IFS
=$
'\n'
1764 for i
in $
(git
--git-dir="$(__gitdir)" config
--get-regexp "remotes\..*" 2>/dev
/null
); do
1778 __git_has_doubledash
&& return
1780 local cur
="${COMP_WORDS[COMP_CWORD]}"
1783 __gitcomp
"--merge --mixed --hard --soft"
1787 __gitcomp
"$(__git_refs)"
1792 local cur
="${COMP_WORDS[COMP_CWORD]}"
1795 __gitcomp
"--edit --mainline --no-edit --no-commit --signoff"
1799 __gitcomp
"$(__git_refs)"
1804 __git_has_doubledash
&& return
1806 local cur
="${COMP_WORDS[COMP_CWORD]}"
1809 __gitcomp
"--cached --dry-run --ignore-unmatch --quiet"
1818 __git_has_doubledash
&& return
1820 local cur
="${COMP_WORDS[COMP_CWORD]}"
1824 $__git_log_common_options
1825 $__git_log_shortlog_options
1826 --numbered --summary
1831 __git_complete_revlist
1836 __git_has_doubledash
&& return
1838 local cur
="${COMP_WORDS[COMP_CWORD]}"
1841 __gitcomp
"$__git_log_pretty_formats
1842 " "" "${cur##--pretty=}"
1846 __gitcomp
"$__git_log_pretty_formats
1847 " "" "${cur##--format=}"
1851 __gitcomp
"--pretty= --format= --abbrev-commit --oneline
1852 $__git_diff_common_options
1862 local cur
="${COMP_WORDS[COMP_CWORD]}"
1866 --all --remotes --topo-order --current --more=
1867 --list --independent --merge-base --no-name
1869 --sha1-name --sparse --topics --reflog
1874 __git_complete_revlist
1879 local subcommands
='save list show apply clear drop pop create branch'
1880 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1881 if [ -z "$subcommand" ]; then
1882 __gitcomp
"$subcommands"
1884 local cur
="${COMP_WORDS[COMP_CWORD]}"
1885 case "$subcommand,$cur" in
1887 __gitcomp
"--keep-index"
1892 show
,--*|drop
,--*|branch
,--*)
1895 show
,*|apply
,*|drop
,*|pop
,*|branch
,*)
1896 __gitcomp
"$(git --git-dir="$
(__gitdir
)" stash list \
1897 | sed -n -e 's/:.*//p')"
1908 __git_has_doubledash
&& return
1910 local subcommands
="add status init update summary foreach sync"
1911 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
1912 local cur
="${COMP_WORDS[COMP_CWORD]}"
1915 __gitcomp
"--quiet --cached"
1918 __gitcomp
"$subcommands"
1928 init fetch clone rebase dcommit log find-rev
1929 set-tree commit-diff info create-ignore propget
1930 proplist show-ignore show-externals branch tag blame
1933 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1934 if [ -z "$subcommand" ]; then
1935 __gitcomp
"$subcommands"
1937 local remote_opts
="--username= --config-dir= --no-auth-cache"
1939 --follow-parent --authors-file= --repack=
1940 --no-metadata --use-svm-props --use-svnsync-props
1941 --log-window-size= --no-checkout --quiet
1942 --repack-flags --use-log-author --localtime
1943 --ignore-paths= $remote_opts
1946 --template= --shared= --trunk= --tags=
1947 --branches= --stdlayout --minimize-url
1948 --no-metadata --use-svm-props --use-svnsync-props
1949 --rewrite-root= --prefix= --use-log-author
1950 --add-author-from $remote_opts
1953 --edit --rmdir --find-copies-harder --copy-similarity=
1956 local cur
="${COMP_WORDS[COMP_CWORD]}"
1957 case "$subcommand,$cur" in
1959 __gitcomp
"--revision= --fetch-all $fc_opts"
1962 __gitcomp
"--revision= $fc_opts $init_opts"
1965 __gitcomp
"$init_opts"
1969 --merge --strategy= --verbose --dry-run
1970 --fetch-all --no-rebase --commit-url
1971 --revision $cmt_opts $fc_opts
1975 __gitcomp
"--stdin $cmt_opts $fc_opts"
1977 create-ignore
,--*|propget
,--*|proplist
,--*|show-ignore
,--*|\
1979 __gitcomp
"--revision="
1983 --limit= --revision= --verbose --incremental
1984 --oneline --show-commit --non-recursive
1985 --authors-file= --color
1990 --merge --verbose --strategy= --local
1991 --fetch-all --dry-run $fc_opts
1995 __gitcomp
"--message= --file= --revision= $cmt_opts"
2001 __gitcomp
"--dry-run --message --tag"
2004 __gitcomp
"--dry-run --message"
2007 __gitcomp
"--git-format"
2011 --config-dir= --ignore-paths= --minimize
2012 --no-auth-cache --username=
2025 while [ $c -lt $COMP_CWORD ]; do
2026 i
="${COMP_WORDS[c]}"
2029 __gitcomp
"$(__git_tags)"
2039 case "${COMP_WORDS[COMP_CWORD-1]}" in
2045 __gitcomp
"$(__git_tags)"
2051 __gitcomp
"$(__git_refs)"
2058 local i c
=1 command __git_dir
2060 while [ $c -lt $COMP_CWORD ]; do
2061 i
="${COMP_WORDS[c]}"
2063 --git-dir=*) __git_dir
="${i#--git-dir=}" ;;
2064 --bare) __git_dir
="." ;;
2065 --version|
-p|
--paginate) ;;
2066 --help) command="help"; break ;;
2067 *) command="$i"; break ;;
2072 if [ -z "$command" ]; then
2073 case "${COMP_WORDS[COMP_CWORD]}" in
2086 *) __gitcomp
"$(__git_porcelain_commands) $(__git_aliases)" ;;
2091 local expansion
=$
(__git_aliased_command
"$command")
2092 [ "$expansion" ] && command="$expansion"
2097 apply
) _git_apply
;;
2098 archive
) _git_archive
;;
2099 bisect
) _git_bisect
;;
2100 bundle
) _git_bundle
;;
2101 branch
) _git_branch
;;
2102 checkout
) _git_checkout
;;
2103 cherry
) _git_cherry
;;
2104 cherry-pick
) _git_cherry_pick
;;
2105 clean
) _git_clean
;;
2106 clone
) _git_clone
;;
2107 commit
) _git_commit
;;
2108 config
) _git_config
;;
2109 describe
) _git_describe
;;
2111 difftool
) _git_difftool
;;
2112 fetch
) _git_fetch
;;
2113 format-patch
) _git_format_patch
;;
2120 ls-files
) _git_ls_files
;;
2121 ls-remote
) _git_ls_remote
;;
2122 ls-tree
) _git_ls_tree
;;
2124 mergetool
) _git_mergetool
;;
2125 merge-base
) _git_merge_base
;;
2127 name-rev
) _git_name_rev
;;
2130 rebase
) _git_rebase
;;
2131 remote
) _git_remote
;;
2132 reset) _git_reset
;;
2133 revert
) _git_revert
;;
2135 send-email
) _git_send_email
;;
2136 shortlog
) _git_shortlog
;;
2138 show-branch
) _git_show_branch
;;
2139 stash
) _git_stash
;;
2141 submodule
) _git_submodule
;;
2144 whatchanged
) _git_log
;;
2151 __git_has_doubledash
&& return
2153 local cur
="${COMP_WORDS[COMP_CWORD]}"
2154 local g
="$(__gitdir)"
2156 if [ -f "$g/MERGE_HEAD" ]; then
2162 $__git_log_common_options
2163 $__git_log_gitk_options
2169 __git_complete_revlist
2172 complete
-o bashdefault
-o default
-o nospace
-F _git git
2>/dev
/null \
2173 || complete
-o default
-o nospace
-F _git git
2174 complete
-o bashdefault
-o default
-o nospace
-F _gitk gitk
2>/dev
/null \
2175 || complete
-o default
-o nospace
-F _gitk gitk
2177 # The following are necessary only for Cygwin, and only are needed
2178 # when the user has tab-completed the executable name and consequently
2179 # included the '.exe' suffix.
2181 if [ Cygwin
= "$(uname -o 2>/dev/null)" ]; then
2182 complete
-o bashdefault
-o default
-o nospace
-F _git git.exe
2>/dev
/null \
2183 || complete
-o default
-o nospace
-F _git git.exe