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
671 --whitespace= --scissors
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
906 local cur
="${COMP_WORDS[COMP_CWORD]}"
910 --all --tags --contains --abbrev= --candidates=
911 --exact-match --debug --long --match --always
915 __gitcomp
"$(__git_refs)"
918 __git_diff_common_options
="--stat --numstat --shortstat --summary
919 --patch-with-stat --name-only --name-status --color
920 --no-color --color-words --no-renames --check
921 --full-index --binary --abbrev --diff-filter=
923 --text --ignore-space-at-eol --ignore-space-change
924 --ignore-all-space --exit-code --quiet --ext-diff
926 --no-prefix --src-prefix= --dst-prefix=
927 --inter-hunk-context=
934 __git_has_doubledash
&& return
936 local cur
="${COMP_WORDS[COMP_CWORD]}"
939 __gitcomp
"--cached --staged --pickaxe-all --pickaxe-regex
940 --base --ours --theirs
941 $__git_diff_common_options
949 __git_mergetools_common
="diffuse ecmerge emerge kdiff3 meld opendiff
950 tkdiff vimdiff gvimdiff xxdiff araxis
955 local cur
="${COMP_WORDS[COMP_CWORD]}"
958 __gitcomp
"$__git_mergetools_common kompare" "" "${cur##--tool=}"
969 __git_fetch_options
="
970 --quiet --verbose --append --upload-pack --force --keep --depth=
976 local cur
="${COMP_WORDS[COMP_CWORD]}"
979 __gitcomp
"$__git_fetch_options"
983 __git_complete_remote_or_refspec
988 local cur
="${COMP_WORDS[COMP_CWORD]}"
993 " "" "${cur##--thread=}"
998 --stdout --attach --no-attach --thread --thread=
1000 --numbered --start-number
1004 --in-reply-to= --cc=
1005 --full-index --binary
1008 --no-prefix --src-prefix= --dst-prefix=
1009 --inline --suffix= --ignore-if-in-upstream
1015 __git_complete_revlist
1020 local cur
="${COMP_WORDS[COMP_CWORD]}"
1024 --tags --root --unreachable --cache --no-reflogs --full
1025 --strict --verbose --lost-found
1035 local cur
="${COMP_WORDS[COMP_CWORD]}"
1038 __gitcomp
"--prune --aggressive"
1047 __git_has_doubledash
&& return
1049 local cur
="${COMP_WORDS[COMP_CWORD]}"
1054 --text --ignore-case --word-regexp --invert-match
1056 --extended-regexp --basic-regexp --fixed-strings
1057 --files-with-matches --name-only
1058 --files-without-match
1061 --and --or --not --all-match
1071 local cur
="${COMP_WORDS[COMP_CWORD]}"
1074 __gitcomp
"--all --info --man --web"
1078 __gitcomp
"$(__git_all_commands)
1079 attributes cli core-tutorial cvs-migration
1080 diffcore gitk glossary hooks ignore modules
1081 repository-layout tutorial tutorial-2
1088 local cur
="${COMP_WORDS[COMP_CWORD]}"
1092 false true umask group all world everybody
1093 " "" "${cur##--shared=}"
1097 __gitcomp
"--quiet --bare --template= --shared --shared="
1106 __git_has_doubledash
&& return
1108 local cur
="${COMP_WORDS[COMP_CWORD]}"
1111 __gitcomp
"--cached --deleted --modified --others --ignored
1112 --stage --directory --no-empty-directory --unmerged
1113 --killed --exclude= --exclude-from=
1114 --exclude-per-directory= --exclude-standard
1115 --error-unmatch --with-tree= --full-name
1116 --abbrev --ignored --exclude-per-directory
1126 __gitcomp
"$(__git_remotes)"
1134 # Options that go well for log, shortlog and gitk
1135 __git_log_common_options
="
1137 --branches --tags --remotes
1138 --first-parent --merges --no-merges
1140 --max-age= --since= --after=
1141 --min-age= --until= --before=
1143 # Options that go well for log and gitk (not shortlog)
1144 __git_log_gitk_options
="
1145 --dense --sparse --full-history
1146 --simplify-merges --simplify-by-decoration
1149 # Options that go well for log and shortlog (not gitk)
1150 __git_log_shortlog_options
="
1151 --author= --committer= --grep=
1155 __git_log_pretty_formats
="oneline short medium full fuller email raw format:"
1156 __git_log_date_formats
="relative iso8601 rfc2822 short local default raw"
1160 __git_has_doubledash
&& return
1162 local cur
="${COMP_WORDS[COMP_CWORD]}"
1163 local g
="$(git rev-parse --git-dir 2>/dev/null)"
1165 if [ -f "$g/MERGE_HEAD" ]; then
1170 __gitcomp
"$__git_log_pretty_formats
1171 " "" "${cur##--pretty=}"
1175 __gitcomp
"$__git_log_pretty_formats
1176 " "" "${cur##--format=}"
1180 __gitcomp
"$__git_log_date_formats" "" "${cur##--date=}"
1184 __gitcomp
"full short no" "" "${cur##--decorate=}"
1189 $__git_log_common_options
1190 $__git_log_shortlog_options
1191 $__git_log_gitk_options
1192 --root --topo-order --date-order --reverse
1193 --follow --full-diff
1194 --abbrev-commit --abbrev=
1195 --relative-date --date=
1196 --pretty= --format= --oneline
1199 --decorate --decorate=
1201 --parents --children
1203 $__git_diff_common_options
1204 --pickaxe-all --pickaxe-regex
1209 __git_complete_revlist
1212 __git_merge_options
="
1213 --no-commit --no-stat --log --no-log --squash --strategy
1214 --commit --stat --no-squash --ff --no-ff
1219 __git_complete_strategy
&& return
1221 local cur
="${COMP_WORDS[COMP_CWORD]}"
1224 __gitcomp
"$__git_merge_options"
1227 __gitcomp
"$(__git_refs)"
1232 local cur
="${COMP_WORDS[COMP_CWORD]}"
1235 __gitcomp
"$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1248 __gitcomp
"$(__git_refs)"
1253 local cur
="${COMP_WORDS[COMP_CWORD]}"
1256 __gitcomp
"--dry-run"
1265 __gitcomp
"--tags --all --stdin"
1270 __git_complete_strategy
&& return
1272 local cur
="${COMP_WORDS[COMP_CWORD]}"
1276 --rebase --no-rebase
1277 $__git_merge_options
1278 $__git_fetch_options
1283 __git_complete_remote_or_refspec
1288 local cur
="${COMP_WORDS[COMP_CWORD]}"
1289 case "${COMP_WORDS[COMP_CWORD-1]}" in
1291 __gitcomp
"$(__git_remotes)"
1296 __gitcomp
"$(__git_remotes)" "" "${cur##--repo=}"
1301 --all --mirror --tags --dry-run --force --verbose
1302 --receive-pack= --repo=
1307 __git_complete_remote_or_refspec
1312 local cur
="${COMP_WORDS[COMP_CWORD]}" dir
="$(__gitdir)"
1313 if [ -d "$dir"/rebase-apply
] ||
[ -d "$dir"/rebase-merge
]; then
1314 __gitcomp
"--continue --skip --abort"
1317 __git_complete_strategy
&& return
1320 __gitcomp
"--onto --merge --strategy --interactive"
1323 __gitcomp
"$(__git_refs)"
1326 __git_send_email_confirm_options
="always never auto cc compose"
1327 __git_send_email_suppresscc_options
="author self cc bodycc sob cccmd body all"
1331 local cur
="${COMP_WORDS[COMP_CWORD]}"
1335 $__git_send_email_confirm_options
1336 " "" "${cur##--confirm=}"
1341 $__git_send_email_suppresscc_options
1342 " "" "${cur##--suppress-cc=}"
1346 --smtp-encryption=*)
1347 __gitcomp
"ssl tls" "" "${cur##--smtp-encryption=}"
1351 __gitcomp
"--annotate --bcc --cc --cc-cmd --chain-reply-to
1352 --compose --confirm= --dry-run --envelope-sender
1354 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1355 --no-suppress-from --no-thread --quiet
1356 --signed-off-by-cc --smtp-pass --smtp-server
1357 --smtp-server-port --smtp-encryption= --smtp-user
1358 --subject --suppress-cc= --suppress-from --thread --to
1359 --validate --no-validate"
1366 __git_config_get_set_variables
()
1368 local prevword word config_file
= c
=$COMP_CWORD
1369 while [ $c -gt 1 ]; do
1370 word
="${COMP_WORDS[c]}"
1372 --global|
--system|
--file=*)
1377 config_file
="$word $prevword"
1385 git
--git-dir="$(__gitdir)" config
$config_file --list 2>/dev
/null |
1398 local cur
="${COMP_WORDS[COMP_CWORD]}"
1399 local prv
="${COMP_WORDS[COMP_CWORD-1]}"
1402 __gitcomp
"$(__git_remotes)"
1406 __gitcomp
"$(__git_refs)"
1410 local remote
="${prv#remote.}"
1411 remote
="${remote%.fetch}"
1412 __gitcomp
"$(__git_refs_remotes "$remote")"
1416 local remote
="${prv#remote.}"
1417 remote
="${remote%.push}"
1418 __gitcomp
"$(git --git-dir="$
(__gitdir
)" \
1419 for-each-ref --format='%(refname):%(refname)' \
1423 pull.twohead|pull.octopus
)
1424 __gitcomp
"$(__git_merge_strategies)"
1427 color.branch|color.
diff|color.interactive|\
1428 color.showbranch|color.status|color.ui
)
1429 __gitcomp
"always never auto"
1433 __gitcomp
"false true"
1438 normal black red green yellow blue magenta cyan white
1439 bold dim ul blink reverse
1444 __gitcomp
"man info web html"
1448 __gitcomp
"$__git_log_date_formats"
1451 sendemail.aliasesfiletype
)
1452 __gitcomp
"mutt mailrc pine elm gnus"
1456 __gitcomp
"$__git_send_email_confirm_options"
1459 sendemail.suppresscc
)
1460 __gitcomp
"$__git_send_email_suppresscc_options"
1463 --get|
--get-all|
--unset|
--unset-all)
1464 __gitcomp
"$(__git_config_get_set_variables)"
1475 --global --system --file=
1476 --list --replace-all
1477 --get --get-all --get-regexp
1478 --add --unset --unset-all
1479 --remove-section --rename-section
1484 local pfx
="${cur%.*}."
1486 __gitcomp
"remote merge mergeoptions rebase" "$pfx" "$cur"
1490 local pfx
="${cur%.*}."
1492 __gitcomp
"$(__git_heads)" "$pfx" "$cur" "."
1496 local pfx
="${cur%.*}."
1499 argprompt cmd confirm needsfile noconsole norescan
1500 prompt revprompt revunmerged title
1505 local pfx
="${cur%.*}."
1507 __gitcomp
"cmd path" "$pfx" "$cur"
1511 local pfx
="${cur%.*}."
1513 __gitcomp
"cmd path" "$pfx" "$cur"
1517 local pfx
="${cur%.*}."
1519 __gitcomp
"cmd path trustExitCode" "$pfx" "$cur"
1523 local pfx
="${cur%.*}."
1525 __gitcomp
"$(__git_all_commands)" "$pfx" "$cur"
1529 local pfx
="${cur%.*}."
1532 url proxy fetch push mirror skipDefaultUpdate
1533 receivepack uploadpack tagopt pushurl
1538 local pfx
="${cur%.*}."
1540 __gitcomp
"$(__git_remotes)" "$pfx" "$cur" "."
1544 local pfx
="${cur%.*}."
1546 __gitcomp
"insteadOf pushInsteadOf" "$pfx" "$cur"
1553 apply.ignorewhitespace
1555 branch.autosetupmerge
1556 branch.autosetuprebase
1559 color.branch.current
1570 color.diff.whitespace
1575 color.interactive.header
1576 color.interactive.help
1577 color.interactive.prompt
1582 color.status.changed
1584 color.status.nobranch
1585 color.status.untracked
1586 color.status.updated
1593 core.deltaBaseCacheLimit
1597 core.fsyncobjectfiles
1599 core.ignoreCygwinFSTricks
1601 core.logAllRefUpdates
1602 core.loosecompression
1604 core.packedGitWindowSize
1606 core.preferSymlinkRefs
1609 core.repositoryFormatVersion
1611 core.sharedRepository
1614 core.warnAmbiguousRefs
1617 diff.autorefreshindex
1623 diff.suppressBlankEmpty
1635 format.subjectprefix
1644 gc.reflogexpireunreachable
1648 gitcvs.commitmsgannotation
1649 gitcvs.dbTableNamePrefix
1660 gui.copyblamethreshold
1664 gui.matchtrackingbranch
1665 gui.newbranchtemplate
1666 gui.pruneduringfetch
1667 gui.spellingdictionary
1683 i18n.logOutputEncoding
1688 imap.preformattedHTML
1697 interactive.singlekey
1710 mergetool.keepBackup
1713 pack.deltaCacheLimit
1726 receive.denyCurrentBranch
1728 receive.denyNonFastForwards
1731 repack.usedeltabaseoffset
1734 sendemail.aliasesfile
1735 sendemail.aliasesfiletype
1739 sendemail.chainreplyto
1741 sendemail.envelopesender
1743 sendemail.signedoffbycc
1744 sendemail.smtpencryption
1746 sendemail.smtpserver
1747 sendemail.smtpserverport
1749 sendemail.suppresscc
1750 sendemail.suppressfrom
1755 status.relativePaths
1756 status.showUntrackedFiles
1758 transfer.unpackLimit
1770 local subcommands
="add rename rm show prune update set-head"
1771 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1772 if [ -z "$subcommand" ]; then
1773 __gitcomp
"$subcommands"
1777 case "$subcommand" in
1778 rename|
rm|show|prune
)
1779 __gitcomp
"$(__git_remotes)"
1782 local i c
='' IFS
=$
'\n'
1783 for i
in $
(git
--git-dir="$(__gitdir)" config
--get-regexp "remotes\..*" 2>/dev
/null
); do
1797 __git_has_doubledash
&& return
1799 local cur
="${COMP_WORDS[COMP_CWORD]}"
1802 __gitcomp
"--merge --mixed --hard --soft --patch"
1806 __gitcomp
"$(__git_refs)"
1811 local cur
="${COMP_WORDS[COMP_CWORD]}"
1814 __gitcomp
"--edit --mainline --no-edit --no-commit --signoff"
1818 __gitcomp
"$(__git_refs)"
1823 __git_has_doubledash
&& return
1825 local cur
="${COMP_WORDS[COMP_CWORD]}"
1828 __gitcomp
"--cached --dry-run --ignore-unmatch --quiet"
1837 __git_has_doubledash
&& return
1839 local cur
="${COMP_WORDS[COMP_CWORD]}"
1843 $__git_log_common_options
1844 $__git_log_shortlog_options
1845 --numbered --summary
1850 __git_complete_revlist
1855 __git_has_doubledash
&& return
1857 local cur
="${COMP_WORDS[COMP_CWORD]}"
1860 __gitcomp
"$__git_log_pretty_formats
1861 " "" "${cur##--pretty=}"
1865 __gitcomp
"$__git_log_pretty_formats
1866 " "" "${cur##--format=}"
1870 __gitcomp
"--pretty= --format= --abbrev-commit --oneline
1871 $__git_diff_common_options
1881 local cur
="${COMP_WORDS[COMP_CWORD]}"
1885 --all --remotes --topo-order --current --more=
1886 --list --independent --merge-base --no-name
1888 --sha1-name --sparse --topics --reflog
1893 __git_complete_revlist
1898 local cur
="${COMP_WORDS[COMP_CWORD]}"
1899 local save_opts
='--keep-index --no-keep-index --quiet --patch'
1900 local subcommands
='save list show apply clear drop pop create branch'
1901 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1902 if [ -z "$subcommand" ]; then
1905 __gitcomp
"$save_opts"
1908 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
1909 __gitcomp
"$subcommands"
1916 case "$subcommand,$cur" in
1918 __gitcomp
"$save_opts"
1921 __gitcomp
"--index --quiet"
1923 show
,--*|drop
,--*|branch
,--*)
1926 show
,*|apply
,*|drop
,*|pop
,*|branch
,*)
1927 __gitcomp
"$(git --git-dir="$
(__gitdir
)" stash list \
1928 | sed -n -e 's/:.*//p')"
1939 __git_has_doubledash
&& return
1941 local subcommands
="add status init update summary foreach sync"
1942 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
1943 local cur
="${COMP_WORDS[COMP_CWORD]}"
1946 __gitcomp
"--quiet --cached"
1949 __gitcomp
"$subcommands"
1959 init fetch clone rebase dcommit log find-rev
1960 set-tree commit-diff info create-ignore propget
1961 proplist show-ignore show-externals branch tag blame
1964 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1965 if [ -z "$subcommand" ]; then
1966 __gitcomp
"$subcommands"
1968 local remote_opts
="--username= --config-dir= --no-auth-cache"
1970 --follow-parent --authors-file= --repack=
1971 --no-metadata --use-svm-props --use-svnsync-props
1972 --log-window-size= --no-checkout --quiet
1973 --repack-flags --use-log-author --localtime
1974 --ignore-paths= $remote_opts
1977 --template= --shared= --trunk= --tags=
1978 --branches= --stdlayout --minimize-url
1979 --no-metadata --use-svm-props --use-svnsync-props
1980 --rewrite-root= --prefix= --use-log-author
1981 --add-author-from $remote_opts
1984 --edit --rmdir --find-copies-harder --copy-similarity=
1987 local cur
="${COMP_WORDS[COMP_CWORD]}"
1988 case "$subcommand,$cur" in
1990 __gitcomp
"--revision= --fetch-all $fc_opts"
1993 __gitcomp
"--revision= $fc_opts $init_opts"
1996 __gitcomp
"$init_opts"
2000 --merge --strategy= --verbose --dry-run
2001 --fetch-all --no-rebase --commit-url
2002 --revision $cmt_opts $fc_opts
2006 __gitcomp
"--stdin $cmt_opts $fc_opts"
2008 create-ignore
,--*|propget
,--*|proplist
,--*|show-ignore
,--*|\
2010 __gitcomp
"--revision="
2014 --limit= --revision= --verbose --incremental
2015 --oneline --show-commit --non-recursive
2016 --authors-file= --color
2021 --merge --verbose --strategy= --local
2022 --fetch-all --dry-run $fc_opts
2026 __gitcomp
"--message= --file= --revision= $cmt_opts"
2032 __gitcomp
"--dry-run --message --tag"
2035 __gitcomp
"--dry-run --message"
2038 __gitcomp
"--git-format"
2042 --config-dir= --ignore-paths= --minimize
2043 --no-auth-cache --username=
2056 while [ $c -lt $COMP_CWORD ]; do
2057 i
="${COMP_WORDS[c]}"
2060 __gitcomp
"$(__git_tags)"
2070 case "${COMP_WORDS[COMP_CWORD-1]}" in
2076 __gitcomp
"$(__git_tags)"
2082 __gitcomp
"$(__git_refs)"
2089 local i c
=1 command __git_dir
2091 while [ $c -lt $COMP_CWORD ]; do
2092 i
="${COMP_WORDS[c]}"
2094 --git-dir=*) __git_dir
="${i#--git-dir=}" ;;
2095 --bare) __git_dir
="." ;;
2096 --version|
-p|
--paginate) ;;
2097 --help) command="help"; break ;;
2098 *) command="$i"; break ;;
2103 if [ -z "$command" ]; then
2104 case "${COMP_WORDS[COMP_CWORD]}" in
2117 *) __gitcomp
"$(__git_porcelain_commands) $(__git_aliases)" ;;
2122 local expansion
=$
(__git_aliased_command
"$command")
2123 [ "$expansion" ] && command="$expansion"
2128 apply
) _git_apply
;;
2129 archive
) _git_archive
;;
2130 bisect
) _git_bisect
;;
2131 bundle
) _git_bundle
;;
2132 branch
) _git_branch
;;
2133 checkout
) _git_checkout
;;
2134 cherry
) _git_cherry
;;
2135 cherry-pick
) _git_cherry_pick
;;
2136 clean
) _git_clean
;;
2137 clone
) _git_clone
;;
2138 commit
) _git_commit
;;
2139 config
) _git_config
;;
2140 describe
) _git_describe
;;
2142 difftool
) _git_difftool
;;
2143 fetch
) _git_fetch
;;
2144 format-patch
) _git_format_patch
;;
2151 ls-files
) _git_ls_files
;;
2152 ls-remote
) _git_ls_remote
;;
2153 ls-tree
) _git_ls_tree
;;
2155 mergetool
) _git_mergetool
;;
2156 merge-base
) _git_merge_base
;;
2158 name-rev
) _git_name_rev
;;
2161 rebase
) _git_rebase
;;
2162 remote
) _git_remote
;;
2163 reset) _git_reset
;;
2164 revert
) _git_revert
;;
2166 send-email
) _git_send_email
;;
2167 shortlog
) _git_shortlog
;;
2169 show-branch
) _git_show_branch
;;
2170 stash
) _git_stash
;;
2172 submodule
) _git_submodule
;;
2175 whatchanged
) _git_log
;;
2182 __git_has_doubledash
&& return
2184 local cur
="${COMP_WORDS[COMP_CWORD]}"
2185 local g
="$(__gitdir)"
2187 if [ -f "$g/MERGE_HEAD" ]; then
2193 $__git_log_common_options
2194 $__git_log_gitk_options
2200 __git_complete_revlist
2203 complete
-o bashdefault
-o default
-o nospace
-F _git git
2>/dev
/null \
2204 || complete
-o default
-o nospace
-F _git git
2205 complete
-o bashdefault
-o default
-o nospace
-F _gitk gitk
2>/dev
/null \
2206 || complete
-o default
-o nospace
-F _gitk gitk
2208 # The following are necessary only for Cygwin, and only are needed
2209 # when the user has tab-completed the executable name and consequently
2210 # included the '.exe' suffix.
2212 if [ Cygwin
= "$(uname -o 2>/dev/null)" ]; then
2213 complete
-o bashdefault
-o default
-o nospace
-F _git git.exe
2>/dev
/null \
2214 || complete
-o default
-o nospace
-F _git git.exe