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 '^ [a-zA-Z0-9]')
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
614 # __git_aliased_command requires 1 argument
615 __git_aliased_command
()
617 local word cmdline
=$
(git
--git-dir="$(__gitdir)" \
618 config
--get "alias.$1")
619 for word
in $cmdline; do
620 if [ "${word##-*}" ]; then
627 # __git_find_on_cmdline requires 1 argument
628 __git_find_on_cmdline
()
630 local word subcommand c
=1
632 while [ $c -lt $COMP_CWORD ]; do
633 word
="${COMP_WORDS[c]}"
634 for subcommand
in $1; do
635 if [ "$subcommand" = "$word" ]; then
644 __git_has_doubledash
()
647 while [ $c -lt $COMP_CWORD ]; do
648 if [ "--" = "${COMP_WORDS[c]}" ]; then
656 __git_whitespacelist
="nowarn warn error error-all fix"
660 local cur
="${COMP_WORDS[COMP_CWORD]}" dir
="$(__gitdir)"
661 if [ -d "$dir"/rebase-apply
]; then
662 __gitcomp
"--skip --resolved --abort"
667 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
672 --3way --committer-date-is-author-date --ignore-date
673 --ignore-whitespace --ignore-space-change
674 --interactive --keep --no-utf8 --signoff --utf8
675 --whitespace= --scissors
684 local cur
="${COMP_WORDS[COMP_CWORD]}"
687 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
692 --stat --numstat --summary --check --index
693 --cached --index-info --reverse --reject --unidiff-zero
694 --apply --no-add --exclude=
695 --ignore-whitespace --ignore-space-change
696 --whitespace= --inaccurate-eof --verbose
705 __git_has_doubledash
&& return
707 local cur
="${COMP_WORDS[COMP_CWORD]}"
711 --interactive --refresh --patch --update --dry-run
712 --ignore-errors --intent-to-add
721 local cur
="${COMP_WORDS[COMP_CWORD]}"
724 __gitcomp
"$(git archive --list)" "" "${cur##--format=}"
728 __gitcomp
"$(__git_remotes)" "" "${cur##--remote=}"
733 --format= --list --verbose
734 --prefix= --remote= --exec=
744 __git_has_doubledash
&& return
746 local subcommands
="start bad good skip reset visualize replay log run"
747 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
748 if [ -z "$subcommand" ]; then
749 __gitcomp
"$subcommands"
753 case "$subcommand" in
755 __gitcomp
"$(__git_refs)"
765 local i c
=1 only_local_ref
="n" has_r
="n"
767 while [ $c -lt $COMP_CWORD ]; do
770 -d|
-m) only_local_ref
="y" ;;
776 case "${COMP_WORDS[COMP_CWORD]}" in
779 --color --no-color --verbose --abbrev= --no-abbrev
780 --track --no-track --contains --merged --no-merged
784 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
785 __gitcomp
"$(__git_heads)"
787 __gitcomp
"$(__git_refs)"
795 local cmd
="${COMP_WORDS[2]}"
796 case "$COMP_CWORD" in
798 __gitcomp
"create list-heads verify unbundle"
806 __git_complete_revlist
815 __git_has_doubledash
&& return
817 local cur
="${COMP_WORDS[COMP_CWORD]}"
820 __gitcomp
"diff3 merge" "" "${cur##--conflict=}"
824 --quiet --ours --theirs --track --no-track --merge
829 __gitcomp
"$(__git_refs)"
836 __gitcomp
"$(__git_refs)"
841 local cur
="${COMP_WORDS[COMP_CWORD]}"
844 __gitcomp
"--edit --no-commit"
847 __gitcomp
"$(__git_refs)"
854 __git_has_doubledash
&& return
856 local cur
="${COMP_WORDS[COMP_CWORD]}"
859 __gitcomp
"--dry-run --quiet"
868 local cur
="${COMP_WORDS[COMP_CWORD]}"
893 __git_has_doubledash
&& return
895 local cur
="${COMP_WORDS[COMP_CWORD]}"
899 --all --author= --signoff --verify --no-verify
900 --edit --amend --include --only --interactive
910 local cur
="${COMP_WORDS[COMP_CWORD]}"
914 --all --tags --contains --abbrev= --candidates=
915 --exact-match --debug --long --match --always
919 __gitcomp
"$(__git_refs)"
922 __git_diff_common_options
="--stat --numstat --shortstat --summary
923 --patch-with-stat --name-only --name-status --color
924 --no-color --color-words --no-renames --check
925 --full-index --binary --abbrev --diff-filter=
927 --text --ignore-space-at-eol --ignore-space-change
928 --ignore-all-space --exit-code --quiet --ext-diff
930 --no-prefix --src-prefix= --dst-prefix=
931 --inter-hunk-context=
934 --dirstat --dirstat= --dirstat-by-file
935 --dirstat-by-file= --cumulative
940 __git_has_doubledash
&& return
942 local cur
="${COMP_WORDS[COMP_CWORD]}"
945 __gitcomp
"--cached --staged --pickaxe-all --pickaxe-regex
946 --base --ours --theirs
947 $__git_diff_common_options
955 __git_mergetools_common
="diffuse ecmerge emerge kdiff3 meld opendiff
956 tkdiff vimdiff gvimdiff xxdiff araxis
961 local cur
="${COMP_WORDS[COMP_CWORD]}"
964 __gitcomp
"$__git_mergetools_common kompare" "" "${cur##--tool=}"
975 __git_fetch_options
="
976 --quiet --verbose --append --upload-pack --force --keep --depth=
982 local cur
="${COMP_WORDS[COMP_CWORD]}"
985 __gitcomp
"$__git_fetch_options"
989 __git_complete_remote_or_refspec
994 local cur
="${COMP_WORDS[COMP_CWORD]}"
999 " "" "${cur##--thread=}"
1004 --stdout --attach --no-attach --thread --thread=
1006 --numbered --start-number
1010 --in-reply-to= --cc=
1011 --full-index --binary
1014 --no-prefix --src-prefix= --dst-prefix=
1015 --inline --suffix= --ignore-if-in-upstream
1021 __git_complete_revlist
1026 local cur
="${COMP_WORDS[COMP_CWORD]}"
1030 --tags --root --unreachable --cache --no-reflogs --full
1031 --strict --verbose --lost-found
1041 local cur
="${COMP_WORDS[COMP_CWORD]}"
1044 __gitcomp
"--prune --aggressive"
1053 __git_has_doubledash
&& return
1055 local cur
="${COMP_WORDS[COMP_CWORD]}"
1060 --text --ignore-case --word-regexp --invert-match
1062 --extended-regexp --basic-regexp --fixed-strings
1063 --files-with-matches --name-only
1064 --files-without-match
1067 --and --or --not --all-match
1073 __gitcomp
"$(__git_refs)"
1078 local cur
="${COMP_WORDS[COMP_CWORD]}"
1081 __gitcomp
"--all --info --man --web"
1085 __gitcomp
"$(__git_all_commands)
1086 attributes cli core-tutorial cvs-migration
1087 diffcore gitk glossary hooks ignore modules
1088 repository-layout tutorial tutorial-2
1095 local cur
="${COMP_WORDS[COMP_CWORD]}"
1099 false true umask group all world everybody
1100 " "" "${cur##--shared=}"
1104 __gitcomp
"--quiet --bare --template= --shared --shared="
1113 __git_has_doubledash
&& return
1115 local cur
="${COMP_WORDS[COMP_CWORD]}"
1118 __gitcomp
"--cached --deleted --modified --others --ignored
1119 --stage --directory --no-empty-directory --unmerged
1120 --killed --exclude= --exclude-from=
1121 --exclude-per-directory= --exclude-standard
1122 --error-unmatch --with-tree= --full-name
1123 --abbrev --ignored --exclude-per-directory
1133 __gitcomp
"$(__git_remotes)"
1141 # Options that go well for log, shortlog and gitk
1142 __git_log_common_options
="
1144 --branches --tags --remotes
1145 --first-parent --merges --no-merges
1147 --max-age= --since= --after=
1148 --min-age= --until= --before=
1150 # Options that go well for log and gitk (not shortlog)
1151 __git_log_gitk_options
="
1152 --dense --sparse --full-history
1153 --simplify-merges --simplify-by-decoration
1156 # Options that go well for log and shortlog (not gitk)
1157 __git_log_shortlog_options
="
1158 --author= --committer= --grep=
1162 __git_log_pretty_formats
="oneline short medium full fuller email raw format:"
1163 __git_log_date_formats
="relative iso8601 rfc2822 short local default raw"
1167 __git_has_doubledash
&& return
1169 local cur
="${COMP_WORDS[COMP_CWORD]}"
1170 local g
="$(git rev-parse --git-dir 2>/dev/null)"
1172 if [ -f "$g/MERGE_HEAD" ]; then
1177 __gitcomp
"$__git_log_pretty_formats
1178 " "" "${cur##--pretty=}"
1182 __gitcomp
"$__git_log_pretty_formats
1183 " "" "${cur##--format=}"
1187 __gitcomp
"$__git_log_date_formats" "" "${cur##--date=}"
1191 __gitcomp
"long short" "" "${cur##--decorate=}"
1196 $__git_log_common_options
1197 $__git_log_shortlog_options
1198 $__git_log_gitk_options
1199 --root --topo-order --date-order --reverse
1200 --follow --full-diff
1201 --abbrev-commit --abbrev=
1202 --relative-date --date=
1203 --pretty= --format= --oneline
1206 --decorate --decorate=
1208 --parents --children
1210 $__git_diff_common_options
1211 --pickaxe-all --pickaxe-regex
1216 __git_complete_revlist
1219 __git_merge_options
="
1220 --no-commit --no-stat --log --no-log --squash --strategy
1221 --commit --stat --no-squash --ff --no-ff
1226 __git_complete_strategy
&& return
1228 local cur
="${COMP_WORDS[COMP_CWORD]}"
1231 __gitcomp
"$__git_merge_options"
1234 __gitcomp
"$(__git_refs)"
1239 local cur
="${COMP_WORDS[COMP_CWORD]}"
1242 __gitcomp
"$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1255 __gitcomp
"$(__git_refs)"
1260 local cur
="${COMP_WORDS[COMP_CWORD]}"
1263 __gitcomp
"--dry-run"
1272 __gitcomp
"--tags --all --stdin"
1277 __git_complete_strategy
&& return
1279 local cur
="${COMP_WORDS[COMP_CWORD]}"
1283 --rebase --no-rebase
1284 $__git_merge_options
1285 $__git_fetch_options
1290 __git_complete_remote_or_refspec
1295 local cur
="${COMP_WORDS[COMP_CWORD]}"
1296 case "${COMP_WORDS[COMP_CWORD-1]}" in
1298 __gitcomp
"$(__git_remotes)"
1303 __gitcomp
"$(__git_remotes)" "" "${cur##--repo=}"
1308 --all --mirror --tags --dry-run --force --verbose
1309 --receive-pack= --repo=
1314 __git_complete_remote_or_refspec
1319 local cur
="${COMP_WORDS[COMP_CWORD]}" dir
="$(__gitdir)"
1320 if [ -d "$dir"/rebase-apply
] ||
[ -d "$dir"/rebase-merge
]; then
1321 __gitcomp
"--continue --skip --abort"
1324 __git_complete_strategy
&& return
1327 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
1332 --onto --merge --strategy --interactive
1333 --preserve-merges --stat --no-stat
1334 --committer-date-is-author-date --ignore-date
1335 --ignore-whitespace --whitespace=
1340 __gitcomp
"$(__git_refs)"
1343 __git_send_email_confirm_options
="always never auto cc compose"
1344 __git_send_email_suppresscc_options
="author self cc bodycc sob cccmd body all"
1348 local cur
="${COMP_WORDS[COMP_CWORD]}"
1352 $__git_send_email_confirm_options
1353 " "" "${cur##--confirm=}"
1358 $__git_send_email_suppresscc_options
1359 " "" "${cur##--suppress-cc=}"
1363 --smtp-encryption=*)
1364 __gitcomp
"ssl tls" "" "${cur##--smtp-encryption=}"
1368 __gitcomp
"--annotate --bcc --cc --cc-cmd --chain-reply-to
1369 --compose --confirm= --dry-run --envelope-sender
1371 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1372 --no-suppress-from --no-thread --quiet
1373 --signed-off-by-cc --smtp-pass --smtp-server
1374 --smtp-server-port --smtp-encryption= --smtp-user
1375 --subject --suppress-cc= --suppress-from --thread --to
1376 --validate --no-validate"
1383 __git_config_get_set_variables
()
1385 local prevword word config_file
= c
=$COMP_CWORD
1386 while [ $c -gt 1 ]; do
1387 word
="${COMP_WORDS[c]}"
1389 --global|
--system|
--file=*)
1394 config_file
="$word $prevword"
1402 git
--git-dir="$(__gitdir)" config
$config_file --list 2>/dev
/null |
1415 local cur
="${COMP_WORDS[COMP_CWORD]}"
1416 local prv
="${COMP_WORDS[COMP_CWORD-1]}"
1419 __gitcomp
"$(__git_remotes)"
1423 __gitcomp
"$(__git_refs)"
1427 local remote
="${prv#remote.}"
1428 remote
="${remote%.fetch}"
1429 __gitcomp
"$(__git_refs_remotes "$remote")"
1433 local remote
="${prv#remote.}"
1434 remote
="${remote%.push}"
1435 __gitcomp
"$(git --git-dir="$
(__gitdir
)" \
1436 for-each-ref --format='%(refname):%(refname)' \
1440 pull.twohead|pull.octopus
)
1441 __gitcomp
"$(__git_merge_strategies)"
1444 color.branch|color.
diff|color.interactive|\
1445 color.showbranch|color.status|color.ui
)
1446 __gitcomp
"always never auto"
1450 __gitcomp
"false true"
1455 normal black red green yellow blue magenta cyan white
1456 bold dim ul blink reverse
1461 __gitcomp
"man info web html"
1465 __gitcomp
"$__git_log_date_formats"
1468 sendemail.aliasesfiletype
)
1469 __gitcomp
"mutt mailrc pine elm gnus"
1473 __gitcomp
"$__git_send_email_confirm_options"
1476 sendemail.suppresscc
)
1477 __gitcomp
"$__git_send_email_suppresscc_options"
1480 --get|
--get-all|
--unset|
--unset-all)
1481 __gitcomp
"$(__git_config_get_set_variables)"
1492 --global --system --file=
1493 --list --replace-all
1494 --get --get-all --get-regexp
1495 --add --unset --unset-all
1496 --remove-section --rename-section
1501 local pfx
="${cur%.*}."
1503 __gitcomp
"remote merge mergeoptions rebase" "$pfx" "$cur"
1507 local pfx
="${cur%.*}."
1509 __gitcomp
"$(__git_heads)" "$pfx" "$cur" "."
1513 local pfx
="${cur%.*}."
1516 argprompt cmd confirm needsfile noconsole norescan
1517 prompt revprompt revunmerged title
1522 local pfx
="${cur%.*}."
1524 __gitcomp
"cmd path" "$pfx" "$cur"
1528 local pfx
="${cur%.*}."
1530 __gitcomp
"cmd path" "$pfx" "$cur"
1534 local pfx
="${cur%.*}."
1536 __gitcomp
"cmd path trustExitCode" "$pfx" "$cur"
1540 local pfx
="${cur%.*}."
1542 __gitcomp
"$(__git_all_commands)" "$pfx" "$cur"
1546 local pfx
="${cur%.*}."
1549 url proxy fetch push mirror skipDefaultUpdate
1550 receivepack uploadpack tagopt pushurl
1555 local pfx
="${cur%.*}."
1557 __gitcomp
"$(__git_remotes)" "$pfx" "$cur" "."
1561 local pfx
="${cur%.*}."
1563 __gitcomp
"insteadOf pushInsteadOf" "$pfx" "$cur"
1570 apply.ignorewhitespace
1572 branch.autosetupmerge
1573 branch.autosetuprebase
1576 color.branch.current
1587 color.diff.whitespace
1592 color.interactive.header
1593 color.interactive.help
1594 color.interactive.prompt
1599 color.status.changed
1601 color.status.nobranch
1602 color.status.untracked
1603 color.status.updated
1610 core.deltaBaseCacheLimit
1614 core.fsyncobjectfiles
1616 core.ignoreCygwinFSTricks
1618 core.logAllRefUpdates
1619 core.loosecompression
1621 core.packedGitWindowSize
1623 core.preferSymlinkRefs
1626 core.repositoryFormatVersion
1628 core.sharedRepository
1631 core.warnAmbiguousRefs
1634 diff.autorefreshindex
1640 diff.suppressBlankEmpty
1652 format.subjectprefix
1661 gc.reflogexpireunreachable
1665 gitcvs.commitmsgannotation
1666 gitcvs.dbTableNamePrefix
1677 gui.copyblamethreshold
1681 gui.matchtrackingbranch
1682 gui.newbranchtemplate
1683 gui.pruneduringfetch
1684 gui.spellingdictionary
1700 i18n.logOutputEncoding
1705 imap.preformattedHTML
1714 interactive.singlekey
1727 mergetool.keepBackup
1730 pack.deltaCacheLimit
1743 receive.denyCurrentBranch
1745 receive.denyNonFastForwards
1748 repack.usedeltabaseoffset
1751 sendemail.aliasesfile
1752 sendemail.aliasesfiletype
1756 sendemail.chainreplyto
1758 sendemail.envelopesender
1760 sendemail.signedoffbycc
1761 sendemail.smtpencryption
1763 sendemail.smtpserver
1764 sendemail.smtpserverport
1766 sendemail.suppresscc
1767 sendemail.suppressfrom
1772 status.relativePaths
1773 status.showUntrackedFiles
1775 transfer.unpackLimit
1787 local subcommands
="add rename rm show prune update set-head"
1788 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1789 if [ -z "$subcommand" ]; then
1790 __gitcomp
"$subcommands"
1794 case "$subcommand" in
1795 rename|
rm|show|prune
)
1796 __gitcomp
"$(__git_remotes)"
1799 local i c
='' IFS
=$
'\n'
1800 for i
in $
(git
--git-dir="$(__gitdir)" config
--get-regexp "remotes\..*" 2>/dev
/null
); do
1814 __gitcomp
"$(__git_refs)"
1819 __git_has_doubledash
&& return
1821 local cur
="${COMP_WORDS[COMP_CWORD]}"
1824 __gitcomp
"--merge --mixed --hard --soft --patch"
1828 __gitcomp
"$(__git_refs)"
1833 local cur
="${COMP_WORDS[COMP_CWORD]}"
1836 __gitcomp
"--edit --mainline --no-edit --no-commit --signoff"
1840 __gitcomp
"$(__git_refs)"
1845 __git_has_doubledash
&& return
1847 local cur
="${COMP_WORDS[COMP_CWORD]}"
1850 __gitcomp
"--cached --dry-run --ignore-unmatch --quiet"
1859 __git_has_doubledash
&& return
1861 local cur
="${COMP_WORDS[COMP_CWORD]}"
1865 $__git_log_common_options
1866 $__git_log_shortlog_options
1867 --numbered --summary
1872 __git_complete_revlist
1877 __git_has_doubledash
&& return
1879 local cur
="${COMP_WORDS[COMP_CWORD]}"
1882 __gitcomp
"$__git_log_pretty_formats
1883 " "" "${cur##--pretty=}"
1887 __gitcomp
"$__git_log_pretty_formats
1888 " "" "${cur##--format=}"
1892 __gitcomp
"--pretty= --format= --abbrev-commit --oneline
1893 $__git_diff_common_options
1903 local cur
="${COMP_WORDS[COMP_CWORD]}"
1907 --all --remotes --topo-order --current --more=
1908 --list --independent --merge-base --no-name
1910 --sha1-name --sparse --topics --reflog
1915 __git_complete_revlist
1920 local cur
="${COMP_WORDS[COMP_CWORD]}"
1921 local save_opts
='--keep-index --no-keep-index --quiet --patch'
1922 local subcommands
='save list show apply clear drop pop create branch'
1923 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1924 if [ -z "$subcommand" ]; then
1927 __gitcomp
"$save_opts"
1930 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
1931 __gitcomp
"$subcommands"
1938 case "$subcommand,$cur" in
1940 __gitcomp
"$save_opts"
1943 __gitcomp
"--index --quiet"
1945 show
,--*|drop
,--*|branch
,--*)
1948 show
,*|apply
,*|drop
,*|pop
,*|branch
,*)
1949 __gitcomp
"$(git --git-dir="$
(__gitdir
)" stash list \
1950 | sed -n -e 's/:.*//p')"
1961 __git_has_doubledash
&& return
1963 local subcommands
="add status init update summary foreach sync"
1964 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
1965 local cur
="${COMP_WORDS[COMP_CWORD]}"
1968 __gitcomp
"--quiet --cached"
1971 __gitcomp
"$subcommands"
1981 init fetch clone rebase dcommit log find-rev
1982 set-tree commit-diff info create-ignore propget
1983 proplist show-ignore show-externals branch tag blame
1986 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1987 if [ -z "$subcommand" ]; then
1988 __gitcomp
"$subcommands"
1990 local remote_opts
="--username= --config-dir= --no-auth-cache"
1992 --follow-parent --authors-file= --repack=
1993 --no-metadata --use-svm-props --use-svnsync-props
1994 --log-window-size= --no-checkout --quiet
1995 --repack-flags --use-log-author --localtime
1996 --ignore-paths= $remote_opts
1999 --template= --shared= --trunk= --tags=
2000 --branches= --stdlayout --minimize-url
2001 --no-metadata --use-svm-props --use-svnsync-props
2002 --rewrite-root= --prefix= --use-log-author
2003 --add-author-from $remote_opts
2006 --edit --rmdir --find-copies-harder --copy-similarity=
2009 local cur
="${COMP_WORDS[COMP_CWORD]}"
2010 case "$subcommand,$cur" in
2012 __gitcomp
"--revision= --fetch-all $fc_opts"
2015 __gitcomp
"--revision= $fc_opts $init_opts"
2018 __gitcomp
"$init_opts"
2022 --merge --strategy= --verbose --dry-run
2023 --fetch-all --no-rebase --commit-url
2024 --revision $cmt_opts $fc_opts
2028 __gitcomp
"--stdin $cmt_opts $fc_opts"
2030 create-ignore
,--*|propget
,--*|proplist
,--*|show-ignore
,--*|\
2032 __gitcomp
"--revision="
2036 --limit= --revision= --verbose --incremental
2037 --oneline --show-commit --non-recursive
2038 --authors-file= --color
2043 --merge --verbose --strategy= --local
2044 --fetch-all --dry-run $fc_opts
2048 __gitcomp
"--message= --file= --revision= $cmt_opts"
2054 __gitcomp
"--dry-run --message --tag"
2057 __gitcomp
"--dry-run --message"
2060 __gitcomp
"--git-format"
2064 --config-dir= --ignore-paths= --minimize
2065 --no-auth-cache --username=
2078 while [ $c -lt $COMP_CWORD ]; do
2079 i
="${COMP_WORDS[c]}"
2082 __gitcomp
"$(__git_tags)"
2092 case "${COMP_WORDS[COMP_CWORD-1]}" in
2098 __gitcomp
"$(__git_tags)"
2104 __gitcomp
"$(__git_refs)"
2111 local i c
=1 command __git_dir
2113 while [ $c -lt $COMP_CWORD ]; do
2114 i
="${COMP_WORDS[c]}"
2116 --git-dir=*) __git_dir
="${i#--git-dir=}" ;;
2117 --bare) __git_dir
="." ;;
2118 --version|
-p|
--paginate) ;;
2119 --help) command="help"; break ;;
2120 *) command="$i"; break ;;
2125 if [ -z "$command" ]; then
2126 case "${COMP_WORDS[COMP_CWORD]}" in
2139 *) __gitcomp
"$(__git_porcelain_commands) $(__git_aliases)" ;;
2144 local expansion
=$
(__git_aliased_command
"$command")
2145 [ "$expansion" ] && command="$expansion"
2150 apply
) _git_apply
;;
2151 archive
) _git_archive
;;
2152 bisect
) _git_bisect
;;
2153 bundle
) _git_bundle
;;
2154 branch
) _git_branch
;;
2155 checkout
) _git_checkout
;;
2156 cherry
) _git_cherry
;;
2157 cherry-pick
) _git_cherry_pick
;;
2158 clean
) _git_clean
;;
2159 clone
) _git_clone
;;
2160 commit
) _git_commit
;;
2161 config
) _git_config
;;
2162 describe
) _git_describe
;;
2164 difftool
) _git_difftool
;;
2165 fetch
) _git_fetch
;;
2166 format-patch
) _git_format_patch
;;
2173 ls-files
) _git_ls_files
;;
2174 ls-remote
) _git_ls_remote
;;
2175 ls-tree
) _git_ls_tree
;;
2177 mergetool
) _git_mergetool
;;
2178 merge-base
) _git_merge_base
;;
2180 name-rev
) _git_name_rev
;;
2183 rebase
) _git_rebase
;;
2184 remote
) _git_remote
;;
2185 replace
) _git_replace
;;
2186 reset) _git_reset
;;
2187 revert
) _git_revert
;;
2189 send-email
) _git_send_email
;;
2190 shortlog
) _git_shortlog
;;
2192 show-branch
) _git_show_branch
;;
2193 stash
) _git_stash
;;
2195 submodule
) _git_submodule
;;
2198 whatchanged
) _git_log
;;
2205 __git_has_doubledash
&& return
2207 local cur
="${COMP_WORDS[COMP_CWORD]}"
2208 local g
="$(__gitdir)"
2210 if [ -f "$g/MERGE_HEAD" ]; then
2216 $__git_log_common_options
2217 $__git_log_gitk_options
2223 __git_complete_revlist
2226 complete
-o bashdefault
-o default
-o nospace
-F _git git
2>/dev
/null \
2227 || complete
-o default
-o nospace
-F _git git
2228 complete
-o bashdefault
-o default
-o nospace
-F _gitk gitk
2>/dev
/null \
2229 || complete
-o default
-o nospace
-F _gitk gitk
2231 # The following are necessary only for Cygwin, and only are needed
2232 # when the user has tab-completed the executable name and consequently
2233 # included the '.exe' suffix.
2235 if [ Cygwin
= "$(uname -o 2>/dev/null)" ]; then
2236 complete
-o bashdefault
-o default
-o nospace
-F _git git.exe
2>/dev
/null \
2237 || complete
-o default
-o nospace
-F _git git.exe