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 p4merge
961 __git_has_doubledash
&& return
963 local cur
="${COMP_WORDS[COMP_CWORD]}"
966 __gitcomp
"$__git_mergetools_common kompare" "" "${cur##--tool=}"
970 __gitcomp
"--cached --staged --pickaxe-all --pickaxe-regex
971 --base --ours --theirs
972 --no-renames --diff-filter= --find-copies-harder
973 --relative --ignore-submodules
981 __git_fetch_options
="
982 --quiet --verbose --append --upload-pack --force --keep --depth=
988 local cur
="${COMP_WORDS[COMP_CWORD]}"
991 __gitcomp
"$__git_fetch_options"
995 __git_complete_remote_or_refspec
1000 local cur
="${COMP_WORDS[COMP_CWORD]}"
1005 " "" "${cur##--thread=}"
1010 --stdout --attach --no-attach --thread --thread=
1012 --numbered --start-number
1016 --in-reply-to= --cc=
1017 --full-index --binary
1020 --no-prefix --src-prefix= --dst-prefix=
1021 --inline --suffix= --ignore-if-in-upstream
1027 __git_complete_revlist
1032 local cur
="${COMP_WORDS[COMP_CWORD]}"
1036 --tags --root --unreachable --cache --no-reflogs --full
1037 --strict --verbose --lost-found
1047 local cur
="${COMP_WORDS[COMP_CWORD]}"
1050 __gitcomp
"--prune --aggressive"
1059 __git_has_doubledash
&& return
1061 local cur
="${COMP_WORDS[COMP_CWORD]}"
1066 --text --ignore-case --word-regexp --invert-match
1068 --extended-regexp --basic-regexp --fixed-strings
1069 --files-with-matches --name-only
1070 --files-without-match
1073 --and --or --not --all-match
1079 __gitcomp
"$(__git_refs)"
1084 local cur
="${COMP_WORDS[COMP_CWORD]}"
1087 __gitcomp
"--all --info --man --web"
1091 __gitcomp
"$(__git_all_commands)
1092 attributes cli core-tutorial cvs-migration
1093 diffcore gitk glossary hooks ignore modules
1094 repository-layout tutorial tutorial-2
1101 local cur
="${COMP_WORDS[COMP_CWORD]}"
1105 false true umask group all world everybody
1106 " "" "${cur##--shared=}"
1110 __gitcomp
"--quiet --bare --template= --shared --shared="
1119 __git_has_doubledash
&& return
1121 local cur
="${COMP_WORDS[COMP_CWORD]}"
1124 __gitcomp
"--cached --deleted --modified --others --ignored
1125 --stage --directory --no-empty-directory --unmerged
1126 --killed --exclude= --exclude-from=
1127 --exclude-per-directory= --exclude-standard
1128 --error-unmatch --with-tree= --full-name
1129 --abbrev --ignored --exclude-per-directory
1139 __gitcomp
"$(__git_remotes)"
1147 # Options that go well for log, shortlog and gitk
1148 __git_log_common_options
="
1150 --branches --tags --remotes
1151 --first-parent --merges --no-merges
1153 --max-age= --since= --after=
1154 --min-age= --until= --before=
1156 # Options that go well for log and gitk (not shortlog)
1157 __git_log_gitk_options
="
1158 --dense --sparse --full-history
1159 --simplify-merges --simplify-by-decoration
1162 # Options that go well for log and shortlog (not gitk)
1163 __git_log_shortlog_options
="
1164 --author= --committer= --grep=
1168 __git_log_pretty_formats
="oneline short medium full fuller email raw format:"
1169 __git_log_date_formats
="relative iso8601 rfc2822 short local default raw"
1173 __git_has_doubledash
&& return
1175 local cur
="${COMP_WORDS[COMP_CWORD]}"
1176 local g
="$(git rev-parse --git-dir 2>/dev/null)"
1178 if [ -f "$g/MERGE_HEAD" ]; then
1183 __gitcomp
"$__git_log_pretty_formats
1184 " "" "${cur##--pretty=}"
1188 __gitcomp
"$__git_log_pretty_formats
1189 " "" "${cur##--format=}"
1193 __gitcomp
"$__git_log_date_formats" "" "${cur##--date=}"
1197 __gitcomp
"long short" "" "${cur##--decorate=}"
1202 $__git_log_common_options
1203 $__git_log_shortlog_options
1204 $__git_log_gitk_options
1205 --root --topo-order --date-order --reverse
1206 --follow --full-diff
1207 --abbrev-commit --abbrev=
1208 --relative-date --date=
1209 --pretty= --format= --oneline
1212 --decorate --decorate=
1214 --parents --children
1216 $__git_diff_common_options
1217 --pickaxe-all --pickaxe-regex
1222 __git_complete_revlist
1225 __git_merge_options
="
1226 --no-commit --no-stat --log --no-log --squash --strategy
1227 --commit --stat --no-squash --ff --no-ff --ff-only
1232 __git_complete_strategy
&& return
1234 local cur
="${COMP_WORDS[COMP_CWORD]}"
1237 __gitcomp
"$__git_merge_options"
1240 __gitcomp
"$(__git_refs)"
1245 local cur
="${COMP_WORDS[COMP_CWORD]}"
1248 __gitcomp
"$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1261 __gitcomp
"$(__git_refs)"
1266 local cur
="${COMP_WORDS[COMP_CWORD]}"
1269 __gitcomp
"--dry-run"
1278 __gitcomp
"--tags --all --stdin"
1283 __git_complete_strategy
&& return
1285 local cur
="${COMP_WORDS[COMP_CWORD]}"
1289 --rebase --no-rebase
1290 $__git_merge_options
1291 $__git_fetch_options
1296 __git_complete_remote_or_refspec
1301 local cur
="${COMP_WORDS[COMP_CWORD]}"
1302 case "${COMP_WORDS[COMP_CWORD-1]}" in
1304 __gitcomp
"$(__git_remotes)"
1309 __gitcomp
"$(__git_remotes)" "" "${cur##--repo=}"
1314 --all --mirror --tags --dry-run --force --verbose
1315 --receive-pack= --repo=
1320 __git_complete_remote_or_refspec
1325 local cur
="${COMP_WORDS[COMP_CWORD]}" dir
="$(__gitdir)"
1326 if [ -d "$dir"/rebase-apply
] ||
[ -d "$dir"/rebase-merge
]; then
1327 __gitcomp
"--continue --skip --abort"
1330 __git_complete_strategy
&& return
1333 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
1338 --onto --merge --strategy --interactive
1339 --preserve-merges --stat --no-stat
1340 --committer-date-is-author-date --ignore-date
1341 --ignore-whitespace --whitespace=
1346 __gitcomp
"$(__git_refs)"
1349 __git_send_email_confirm_options
="always never auto cc compose"
1350 __git_send_email_suppresscc_options
="author self cc bodycc sob cccmd body all"
1354 local cur
="${COMP_WORDS[COMP_CWORD]}"
1358 $__git_send_email_confirm_options
1359 " "" "${cur##--confirm=}"
1364 $__git_send_email_suppresscc_options
1365 " "" "${cur##--suppress-cc=}"
1369 --smtp-encryption=*)
1370 __gitcomp
"ssl tls" "" "${cur##--smtp-encryption=}"
1374 __gitcomp
"--annotate --bcc --cc --cc-cmd --chain-reply-to
1375 --compose --confirm= --dry-run --envelope-sender
1377 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1378 --no-suppress-from --no-thread --quiet
1379 --signed-off-by-cc --smtp-pass --smtp-server
1380 --smtp-server-port --smtp-encryption= --smtp-user
1381 --subject --suppress-cc= --suppress-from --thread --to
1382 --validate --no-validate"
1389 __git_config_get_set_variables
()
1391 local prevword word config_file
= c
=$COMP_CWORD
1392 while [ $c -gt 1 ]; do
1393 word
="${COMP_WORDS[c]}"
1395 --global|
--system|
--file=*)
1400 config_file
="$word $prevword"
1408 git
--git-dir="$(__gitdir)" config
$config_file --list 2>/dev
/null |
1421 local cur
="${COMP_WORDS[COMP_CWORD]}"
1422 local prv
="${COMP_WORDS[COMP_CWORD-1]}"
1425 __gitcomp
"$(__git_remotes)"
1429 __gitcomp
"$(__git_refs)"
1433 local remote
="${prv#remote.}"
1434 remote
="${remote%.fetch}"
1435 __gitcomp
"$(__git_refs_remotes "$remote")"
1439 local remote
="${prv#remote.}"
1440 remote
="${remote%.push}"
1441 __gitcomp
"$(git --git-dir="$
(__gitdir
)" \
1442 for-each-ref --format='%(refname):%(refname)' \
1446 pull.twohead|pull.octopus
)
1447 __gitcomp
"$(__git_merge_strategies)"
1450 color.branch|color.
diff|color.interactive|\
1451 color.showbranch|color.status|color.ui
)
1452 __gitcomp
"always never auto"
1456 __gitcomp
"false true"
1461 normal black red green yellow blue magenta cyan white
1462 bold dim ul blink reverse
1467 __gitcomp
"man info web html"
1471 __gitcomp
"$__git_log_date_formats"
1474 sendemail.aliasesfiletype
)
1475 __gitcomp
"mutt mailrc pine elm gnus"
1479 __gitcomp
"$__git_send_email_confirm_options"
1482 sendemail.suppresscc
)
1483 __gitcomp
"$__git_send_email_suppresscc_options"
1486 --get|
--get-all|
--unset|
--unset-all)
1487 __gitcomp
"$(__git_config_get_set_variables)"
1498 --global --system --file=
1499 --list --replace-all
1500 --get --get-all --get-regexp
1501 --add --unset --unset-all
1502 --remove-section --rename-section
1507 local pfx
="${cur%.*}."
1509 __gitcomp
"remote merge mergeoptions rebase" "$pfx" "$cur"
1513 local pfx
="${cur%.*}."
1515 __gitcomp
"$(__git_heads)" "$pfx" "$cur" "."
1519 local pfx
="${cur%.*}."
1522 argprompt cmd confirm needsfile noconsole norescan
1523 prompt revprompt revunmerged title
1528 local pfx
="${cur%.*}."
1530 __gitcomp
"cmd path" "$pfx" "$cur"
1534 local pfx
="${cur%.*}."
1536 __gitcomp
"cmd path" "$pfx" "$cur"
1540 local pfx
="${cur%.*}."
1542 __gitcomp
"cmd path trustExitCode" "$pfx" "$cur"
1546 local pfx
="${cur%.*}."
1548 __gitcomp
"$(__git_all_commands)" "$pfx" "$cur"
1552 local pfx
="${cur%.*}."
1555 url proxy fetch push mirror skipDefaultUpdate
1556 receivepack uploadpack tagopt pushurl
1561 local pfx
="${cur%.*}."
1563 __gitcomp
"$(__git_remotes)" "$pfx" "$cur" "."
1567 local pfx
="${cur%.*}."
1569 __gitcomp
"insteadOf pushInsteadOf" "$pfx" "$cur"
1576 apply.ignorewhitespace
1578 branch.autosetupmerge
1579 branch.autosetuprebase
1582 color.branch.current
1593 color.diff.whitespace
1598 color.interactive.header
1599 color.interactive.help
1600 color.interactive.prompt
1605 color.status.changed
1607 color.status.nobranch
1608 color.status.untracked
1609 color.status.updated
1616 core.deltaBaseCacheLimit
1620 core.fsyncobjectfiles
1622 core.ignoreCygwinFSTricks
1624 core.logAllRefUpdates
1625 core.loosecompression
1627 core.packedGitWindowSize
1629 core.preferSymlinkRefs
1632 core.repositoryFormatVersion
1634 core.sharedRepository
1637 core.warnAmbiguousRefs
1640 diff.autorefreshindex
1646 diff.suppressBlankEmpty
1658 format.subjectprefix
1667 gc.reflogexpireunreachable
1671 gitcvs.commitmsgannotation
1672 gitcvs.dbTableNamePrefix
1683 gui.copyblamethreshold
1687 gui.matchtrackingbranch
1688 gui.newbranchtemplate
1689 gui.pruneduringfetch
1690 gui.spellingdictionary
1706 i18n.logOutputEncoding
1711 imap.preformattedHTML
1720 interactive.singlekey
1733 mergetool.keepBackup
1736 pack.deltaCacheLimit
1749 receive.denyCurrentBranch
1751 receive.denyNonFastForwards
1754 repack.usedeltabaseoffset
1757 sendemail.aliasesfile
1758 sendemail.aliasesfiletype
1762 sendemail.chainreplyto
1764 sendemail.envelopesender
1766 sendemail.signedoffbycc
1767 sendemail.smtpencryption
1769 sendemail.smtpserver
1770 sendemail.smtpserverport
1772 sendemail.suppresscc
1773 sendemail.suppressfrom
1778 status.relativePaths
1779 status.showUntrackedFiles
1781 transfer.unpackLimit
1793 local subcommands
="add rename rm show prune update set-head"
1794 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1795 if [ -z "$subcommand" ]; then
1796 __gitcomp
"$subcommands"
1800 case "$subcommand" in
1801 rename|
rm|show|prune
)
1802 __gitcomp
"$(__git_remotes)"
1805 local i c
='' IFS
=$
'\n'
1806 for i
in $
(git
--git-dir="$(__gitdir)" config
--get-regexp "remotes\..*" 2>/dev
/null
); do
1820 __gitcomp
"$(__git_refs)"
1825 __git_has_doubledash
&& return
1827 local cur
="${COMP_WORDS[COMP_CWORD]}"
1830 __gitcomp
"--merge --mixed --hard --soft --patch"
1834 __gitcomp
"$(__git_refs)"
1839 local cur
="${COMP_WORDS[COMP_CWORD]}"
1842 __gitcomp
"--edit --mainline --no-edit --no-commit --signoff"
1846 __gitcomp
"$(__git_refs)"
1851 __git_has_doubledash
&& return
1853 local cur
="${COMP_WORDS[COMP_CWORD]}"
1856 __gitcomp
"--cached --dry-run --ignore-unmatch --quiet"
1865 __git_has_doubledash
&& return
1867 local cur
="${COMP_WORDS[COMP_CWORD]}"
1871 $__git_log_common_options
1872 $__git_log_shortlog_options
1873 --numbered --summary
1878 __git_complete_revlist
1883 __git_has_doubledash
&& return
1885 local cur
="${COMP_WORDS[COMP_CWORD]}"
1888 __gitcomp
"$__git_log_pretty_formats
1889 " "" "${cur##--pretty=}"
1893 __gitcomp
"$__git_log_pretty_formats
1894 " "" "${cur##--format=}"
1898 __gitcomp
"--pretty= --format= --abbrev-commit --oneline
1899 $__git_diff_common_options
1909 local cur
="${COMP_WORDS[COMP_CWORD]}"
1913 --all --remotes --topo-order --current --more=
1914 --list --independent --merge-base --no-name
1916 --sha1-name --sparse --topics --reflog
1921 __git_complete_revlist
1926 local cur
="${COMP_WORDS[COMP_CWORD]}"
1927 local save_opts
='--keep-index --no-keep-index --quiet --patch'
1928 local subcommands
='save list show apply clear drop pop create branch'
1929 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1930 if [ -z "$subcommand" ]; then
1933 __gitcomp
"$save_opts"
1936 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
1937 __gitcomp
"$subcommands"
1944 case "$subcommand,$cur" in
1946 __gitcomp
"$save_opts"
1949 __gitcomp
"--index --quiet"
1951 show
,--*|drop
,--*|branch
,--*)
1954 show
,*|apply
,*|drop
,*|pop
,*|branch
,*)
1955 __gitcomp
"$(git --git-dir="$
(__gitdir
)" stash list \
1956 | sed -n -e 's/:.*//p')"
1967 __git_has_doubledash
&& return
1969 local subcommands
="add status init update summary foreach sync"
1970 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
1971 local cur
="${COMP_WORDS[COMP_CWORD]}"
1974 __gitcomp
"--quiet --cached"
1977 __gitcomp
"$subcommands"
1987 init fetch clone rebase dcommit log find-rev
1988 set-tree commit-diff info create-ignore propget
1989 proplist show-ignore show-externals branch tag blame
1992 local subcommand
="$(__git_find_on_cmdline "$subcommands")"
1993 if [ -z "$subcommand" ]; then
1994 __gitcomp
"$subcommands"
1996 local remote_opts
="--username= --config-dir= --no-auth-cache"
1998 --follow-parent --authors-file= --repack=
1999 --no-metadata --use-svm-props --use-svnsync-props
2000 --log-window-size= --no-checkout --quiet
2001 --repack-flags --use-log-author --localtime
2002 --ignore-paths= $remote_opts
2005 --template= --shared= --trunk= --tags=
2006 --branches= --stdlayout --minimize-url
2007 --no-metadata --use-svm-props --use-svnsync-props
2008 --rewrite-root= --prefix= --use-log-author
2009 --add-author-from $remote_opts
2012 --edit --rmdir --find-copies-harder --copy-similarity=
2015 local cur
="${COMP_WORDS[COMP_CWORD]}"
2016 case "$subcommand,$cur" in
2018 __gitcomp
"--revision= --fetch-all $fc_opts"
2021 __gitcomp
"--revision= $fc_opts $init_opts"
2024 __gitcomp
"$init_opts"
2028 --merge --strategy= --verbose --dry-run
2029 --fetch-all --no-rebase --commit-url
2030 --revision $cmt_opts $fc_opts
2034 __gitcomp
"--stdin $cmt_opts $fc_opts"
2036 create-ignore
,--*|propget
,--*|proplist
,--*|show-ignore
,--*|\
2038 __gitcomp
"--revision="
2042 --limit= --revision= --verbose --incremental
2043 --oneline --show-commit --non-recursive
2044 --authors-file= --color
2049 --merge --verbose --strategy= --local
2050 --fetch-all --dry-run $fc_opts
2054 __gitcomp
"--message= --file= --revision= $cmt_opts"
2060 __gitcomp
"--dry-run --message --tag"
2063 __gitcomp
"--dry-run --message"
2066 __gitcomp
"--git-format"
2070 --config-dir= --ignore-paths= --minimize
2071 --no-auth-cache --username=
2084 while [ $c -lt $COMP_CWORD ]; do
2085 i
="${COMP_WORDS[c]}"
2088 __gitcomp
"$(__git_tags)"
2098 case "${COMP_WORDS[COMP_CWORD-1]}" in
2104 __gitcomp
"$(__git_tags)"
2110 __gitcomp
"$(__git_refs)"
2117 local i c
=1 command __git_dir
2119 while [ $c -lt $COMP_CWORD ]; do
2120 i
="${COMP_WORDS[c]}"
2122 --git-dir=*) __git_dir
="${i#--git-dir=}" ;;
2123 --bare) __git_dir
="." ;;
2124 --version|
-p|
--paginate) ;;
2125 --help) command="help"; break ;;
2126 *) command="$i"; break ;;
2131 if [ -z "$command" ]; then
2132 case "${COMP_WORDS[COMP_CWORD]}" in
2145 *) __gitcomp
"$(__git_porcelain_commands) $(__git_aliases)" ;;
2150 local expansion
=$
(__git_aliased_command
"$command")
2151 [ "$expansion" ] && command="$expansion"
2156 apply
) _git_apply
;;
2157 archive
) _git_archive
;;
2158 bisect
) _git_bisect
;;
2159 bundle
) _git_bundle
;;
2160 branch
) _git_branch
;;
2161 checkout
) _git_checkout
;;
2162 cherry
) _git_cherry
;;
2163 cherry-pick
) _git_cherry_pick
;;
2164 clean
) _git_clean
;;
2165 clone
) _git_clone
;;
2166 commit
) _git_commit
;;
2167 config
) _git_config
;;
2168 describe
) _git_describe
;;
2170 difftool
) _git_difftool
;;
2171 fetch
) _git_fetch
;;
2172 format-patch
) _git_format_patch
;;
2179 ls-files
) _git_ls_files
;;
2180 ls-remote
) _git_ls_remote
;;
2181 ls-tree
) _git_ls_tree
;;
2183 mergetool
) _git_mergetool
;;
2184 merge-base
) _git_merge_base
;;
2186 name-rev
) _git_name_rev
;;
2189 rebase
) _git_rebase
;;
2190 remote
) _git_remote
;;
2191 replace
) _git_replace
;;
2192 reset) _git_reset
;;
2193 revert
) _git_revert
;;
2195 send-email
) _git_send_email
;;
2196 shortlog
) _git_shortlog
;;
2198 show-branch
) _git_show_branch
;;
2199 stash
) _git_stash
;;
2201 submodule
) _git_submodule
;;
2204 whatchanged
) _git_log
;;
2211 __git_has_doubledash
&& return
2213 local cur
="${COMP_WORDS[COMP_CWORD]}"
2214 local g
="$(__gitdir)"
2216 if [ -f "$g/MERGE_HEAD" ]; then
2222 $__git_log_common_options
2223 $__git_log_gitk_options
2229 __git_complete_revlist
2232 complete
-o bashdefault
-o default
-o nospace
-F _git git
2>/dev
/null \
2233 || complete
-o default
-o nospace
-F _git git
2234 complete
-o bashdefault
-o default
-o nospace
-F _gitk gitk
2>/dev
/null \
2235 || complete
-o default
-o nospace
-F _gitk gitk
2237 # The following are necessary only for Cygwin, and only are needed
2238 # when the user has tab-completed the executable name and consequently
2239 # included the '.exe' suffix.
2241 if [ Cygwin
= "$(uname -o 2>/dev/null)" ]; then
2242 complete
-o bashdefault
-o default
-o nospace
-F _git git.exe
2>/dev
/null \
2243 || complete
-o default
-o nospace
-F _git git.exe