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.
45 # *) Read Documentation/SubmittingPatches
46 # *) Send all patches to the current maintainer:
48 # "Shawn O. Pearce" <spearce@spearce.org>
50 # *) Always CC the Git mailing list:
55 case "$COMP_WORDBREAKS" in
57 *) COMP_WORDBREAKS
="$COMP_WORDBREAKS:"
60 # __gitdir accepts 0 or 1 arguments (i.e., location)
61 # returns location of .git repo
64 if [ -z "${1-}" ]; then
65 if [ -n "${__git_dir-}" ]; then
67 elif [ -d .git
]; then
70 git rev-parse
--git-dir 2>/dev
/null
72 elif [ -d "$1/.git" ]; then
79 # __git_ps1 accepts 0 or 1 arguments (i.e., format string)
80 # returns text to add to bash PS1 prompt (includes branch name)
87 if [ -d "$g/rebase-apply" ]; then
88 if [ -f "$g/rebase-apply/rebasing" ]; then
90 elif [ -f "$g/rebase-apply/applying" ]; then
95 b
="$(git symbolic-ref HEAD 2>/dev/null)"
96 elif [ -f "$g/rebase-merge/interactive" ]; then
98 b
="$(cat "$g/rebase-merge
/head-name
")"
99 elif [ -d "$g/rebase-merge" ]; then
101 b
="$(cat "$g/rebase-merge
/head-name
")"
102 elif [ -f "$g/MERGE_HEAD" ]; then
104 b
="$(git symbolic-ref HEAD 2>/dev/null)"
106 if [ -f "$g/BISECT_LOG" ]; then
109 if ! b
="$(git symbolic-ref HEAD 2>/dev/null)"; then
110 if ! b
="$(git describe --exact-match HEAD 2>/dev/null)"; then
111 if [ -r "$g/HEAD" ]; then
112 b
="$(cut -c1-7 "$g/HEAD
")..."
122 if [ "true" = "$(git rev-parse --is-inside-git-dir 2>/dev/null)" ]; then
123 if [ "true" = "$(git config --bool core.bare 2>/dev/null)" ]; then
128 elif [ "true" = "$(git rev-parse --is-inside-work-tree 2>/dev/null)" ]; then
129 if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ]; then
130 if [ "$(git config --bool bash.showDirtyState)" != "false" ]; then
131 git
diff --no-ext-diff --ignore-submodules \
132 --quiet --exit-code || w
="*"
133 if git rev-parse
--quiet --verify HEAD
>/dev
/null
; then
134 git diff-index
--cached --quiet \
135 --ignore-submodules HEAD
-- || i
="+"
144 if [ -n "${1-}" ]; then
145 printf "$1" "$c${b##refs/heads/}$w$i$r"
147 printf " (%s)" "$c${b##refs/heads/}$w$i$r"
153 # __gitcomp_1 requires 2 arguments
156 local c IFS
=' '$
'\t'$
'\n'
159 --*=*) printf %s$
'\n' "$c$2" ;;
160 *.
) printf %s$
'\n' "$c$2" ;;
161 *) printf %s$
'\n' "$c$2 " ;;
166 # __gitcomp accepts 1, 2, 3, or 4 arguments
167 # generates completion reply with compgen
170 local cur
="${COMP_WORDS[COMP_CWORD]}"
171 if [ $# -gt 2 ]; then
180 COMPREPLY
=($
(compgen
-P "${2-}" \
181 -W "$(__gitcomp_1 "${1-}" "${4-}")" \
187 # __git_heads accepts 0 or 1 arguments (to pass to __gitdir)
190 local cmd i is_hash
=y dir
="$(__gitdir "${1-}")"
191 if [ -d "$dir" ]; then
192 git
--git-dir="$dir" for-each-ref
--format='%(refname:short)' \
196 for i
in $
(git ls-remote
"${1-}" 2>/dev
/null
); do
197 case "$is_hash,$i" in
200 n
,refs
/heads
/*) is_hash
=y
; echo "${i#refs/heads/}" ;;
201 n
,*) is_hash
=y
; echo "$i" ;;
206 # __git_tags accepts 0 or 1 arguments (to pass to __gitdir)
209 local cmd i is_hash
=y dir
="$(__gitdir "${1-}")"
210 if [ -d "$dir" ]; then
211 git
--git-dir="$dir" for-each-ref
--format='%(refname:short)' \
215 for i
in $
(git ls-remote
"${1-}" 2>/dev
/null
); do
216 case "$is_hash,$i" in
219 n
,refs
/tags
/*) is_hash
=y
; echo "${i#refs/tags/}" ;;
220 n
,*) is_hash
=y
; echo "$i" ;;
225 # __git_refs accepts 0 or 1 arguments (to pass to __gitdir)
228 local i is_hash
=y dir
="$(__gitdir "${1-}")"
229 local cur
="${COMP_WORDS[COMP_CWORD]}" format refs
230 if [ -d "$dir" ]; then
237 if [ -e "$dir/HEAD" ]; then echo HEAD
; fi
238 format
="refname:short"
239 refs
="refs/tags refs/heads refs/remotes"
242 git
--git-dir="$dir" for-each-ref
--format="%($format)" \
246 for i
in $
(git ls-remote
"$dir" 2>/dev
/null
); do
247 case "$is_hash,$i" in
250 n
,refs
/tags
/*) is_hash
=y
; echo "${i#refs/tags/}" ;;
251 n
,refs
/heads
/*) is_hash
=y
; echo "${i#refs/heads/}" ;;
252 n
,refs
/remotes
/*) is_hash
=y
; echo "${i#refs/remotes/}" ;;
253 n
,*) is_hash
=y
; echo "$i" ;;
258 # __git_refs2 requires 1 argument (to pass to __git_refs)
262 for i
in $
(__git_refs
"$1"); do
267 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
268 __git_refs_remotes
()
270 local cmd i is_hash
=y
271 for i
in $
(git ls-remote
"$1" 2>/dev
/null
); do
272 case "$is_hash,$i" in
275 echo "$i:refs/remotes/$1/${i#refs/heads/}"
279 n
,refs
/tags
/*) is_hash
=y
;;
287 local i ngoff IFS
=$
'\n' d
="$(__gitdir)"
288 shopt -q nullglob || ngoff
=1
290 for i
in "$d/remotes"/*; do
291 echo ${i#$d/remotes/}
293 [ "$ngoff" ] && shopt -u nullglob
294 for i
in $
(git
--git-dir="$d" config
--list); do
304 __git_merge_strategies
()
306 if [ -n "${__git_merge_strategylist-}" ]; then
307 echo "$__git_merge_strategylist"
310 git merge
-s help 2>&1 |
311 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
319 __git_merge_strategylist
=
320 __git_merge_strategylist
=$
(__git_merge_strategies
2>/dev
/null
)
322 __git_complete_file
()
324 local pfx
ls ref cur
="${COMP_WORDS[COMP_CWORD]}"
341 case "$COMP_WORDBREAKS" in
343 *) pfx
="$ref:$pfx" ;;
347 COMPREPLY
=($
(compgen
-P "$pfx" \
348 -W "$(git --git-dir="$
(__gitdir
)" ls-tree "$ls" \
349 | sed '/^100... blob /{
365 __gitcomp
"$(__git_refs)"
370 __git_complete_revlist
()
372 local pfx cur
="${COMP_WORDS[COMP_CWORD]}"
377 __gitcomp
"$(__git_refs)" "$pfx" "$cur"
382 __gitcomp
"$(__git_refs)" "$pfx" "$cur"
385 __gitcomp
"$(__git_refs)"
390 __git_complete_remote_or_refspec
()
392 local cmd
="${COMP_WORDS[1]}"
393 local cur
="${COMP_WORDS[COMP_CWORD]}"
394 local i c
=2 remote
="" pfx
="" lhs
=1 no_complete_refspec
=0
395 while [ $c -lt $COMP_CWORD ]; do
398 --all|
--mirror) [ "$cmd" = "push" ] && no_complete_refspec
=1 ;;
400 *) remote
="$i"; break ;;
404 if [ -z "$remote" ]; then
405 __gitcomp
"$(__git_remotes)"
408 if [ $no_complete_refspec = 1 ]; then
412 [ "$remote" = "." ] && remote
=
415 case "$COMP_WORDBREAKS" in
417 *) pfx
="${cur%%:*}:" ;;
429 if [ $lhs = 1 ]; then
430 __gitcomp
"$(__git_refs2 "$remote")" "$pfx" "$cur"
432 __gitcomp
"$(__git_refs)" "$pfx" "$cur"
436 if [ $lhs = 1 ]; then
437 __gitcomp
"$(__git_refs "$remote")" "$pfx" "$cur"
439 __gitcomp
"$(__git_refs)" "$pfx" "$cur"
443 if [ $lhs = 1 ]; then
444 __gitcomp
"$(__git_refs)" "$pfx" "$cur"
446 __gitcomp
"$(__git_refs "$remote")" "$pfx" "$cur"
452 __git_complete_strategy
()
454 case "${COMP_WORDS[COMP_CWORD-1]}" in
456 __gitcomp
"$(__git_merge_strategies)"
459 local cur
="${COMP_WORDS[COMP_CWORD]}"
462 __gitcomp
"$(__git_merge_strategies)" "" "${cur##--strategy=}"
469 __git_all_commands
()
471 if [ -n "${__git_all_commandlist-}" ]; then
472 echo "$__git_all_commandlist"
476 for i
in $
(git
help -a|
egrep '^ ')
479 *--*) : helper pattern
;;
484 __git_all_commandlist
=
485 __git_all_commandlist
="$(__git_all_commands 2>/dev/null)"
487 __git_porcelain_commands
()
489 if [ -n "${__git_porcelain_commandlist-}" ]; then
490 echo "$__git_porcelain_commandlist"
494 for i
in "help" $
(__git_all_commands
)
497 *--*) : helper pattern
;;
498 applymbox
) : ask gittus
;;
499 applypatch
) : ask gittus
;;
500 archimport
) : import
;;
501 cat-file
) : plumbing
;;
502 check-attr
) : plumbing
;;
503 check-ref-format
) : plumbing
;;
504 checkout-index
) : plumbing
;;
505 commit-tree
) : plumbing
;;
506 count-objects
) : infrequent
;;
507 cvsexportcommit
) : export;;
508 cvsimport
) : import
;;
509 cvsserver
) : daemon
;;
511 diff-files
) : plumbing
;;
512 diff-index
) : plumbing
;;
513 diff-tree
) : plumbing
;;
514 fast-import
) : import
;;
515 fast-export
) : export;;
516 fsck-objects
) : plumbing
;;
517 fetch-pack
) : plumbing
;;
518 fmt-merge-msg
) : plumbing
;;
519 for-each-ref
) : plumbing
;;
520 hash-object
) : plumbing
;;
521 http-
*) : transport
;;
522 index-pack
) : plumbing
;;
523 init-db
) : deprecated
;;
524 local-fetch
) : plumbing
;;
525 lost-found
) : infrequent
;;
526 ls-files
) : plumbing
;;
527 ls-remote
) : plumbing
;;
528 ls-tree
) : plumbing
;;
529 mailinfo
) : plumbing
;;
530 mailsplit
) : plumbing
;;
531 merge-
*) : plumbing
;;
534 pack-objects
) : plumbing
;;
535 pack-redundant
) : plumbing
;;
536 pack-refs
) : plumbing
;;
537 parse-remote
) : plumbing
;;
538 patch-id
) : plumbing
;;
539 peek-remote
) : plumbing
;;
541 prune-packed
) : plumbing
;;
542 quiltimport
) : import
;;
543 read-tree
) : plumbing
;;
544 receive-pack
) : plumbing
;;
546 repo-config
) : deprecated
;;
548 rev-list
) : plumbing
;;
549 rev-parse
) : plumbing
;;
550 runstatus
) : plumbing
;;
551 sh-setup
) : internal
;;
553 show-ref
) : plumbing
;;
554 send-pack
) : plumbing
;;
555 show-index
) : plumbing
;;
557 stripspace
) : plumbing
;;
558 symbolic-ref
) : plumbing
;;
559 tar-tree
) : deprecated
;;
560 unpack-file
) : plumbing
;;
561 unpack-objects
) : plumbing
;;
562 update-index
) : plumbing
;;
563 update-ref
) : plumbing
;;
564 update-server-info
) : daemon
;;
565 upload-archive
) : plumbing
;;
566 upload-pack
) : plumbing
;;
567 write-tree
) : plumbing
;;
569 verify-pack
) : infrequent
;;
570 verify-tag
) : plumbing
;;
575 __git_porcelain_commandlist
=
576 __git_porcelain_commandlist
="$(__git_porcelain_commands 2>/dev/null)"
581 for i
in $
(git
--git-dir="$(__gitdir)" config
--list); do
591 # __git_aliased_command requires 1 argument
592 __git_aliased_command
()
594 local word cmdline
=$
(git
--git-dir="$(__gitdir)" \
595 config
--get "alias.$1")
596 for word
in $cmdline; do
597 if [ "${word##-*}" ]; then
604 # __git_find_subcommand requires 1 argument
605 __git_find_subcommand
()
607 local word subcommand c
=1
609 while [ $c -lt $COMP_CWORD ]; do
610 word
="${COMP_WORDS[c]}"
611 for subcommand
in $1; do
612 if [ "$subcommand" = "$word" ]; then
621 __git_has_doubledash
()
624 while [ $c -lt $COMP_CWORD ]; do
625 if [ "--" = "${COMP_WORDS[c]}" ]; then
633 __git_whitespacelist
="nowarn warn error error-all fix"
637 local cur
="${COMP_WORDS[COMP_CWORD]}" dir
="$(__gitdir)"
638 if [ -d "$dir"/rebase-apply
]; then
639 __gitcomp
"--skip --resolved --abort"
644 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
649 --signoff --utf8 --binary --3way --interactive
659 local cur
="${COMP_WORDS[COMP_CWORD]}"
662 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
667 --stat --numstat --summary --check --index
668 --cached --index-info --reverse --reject --unidiff-zero
669 --apply --no-add --exclude=
670 --whitespace= --inaccurate-eof --verbose
679 __git_has_doubledash
&& return
681 local cur
="${COMP_WORDS[COMP_CWORD]}"
685 --interactive --refresh --patch --update --dry-run
686 --ignore-errors --intent-to-add
695 local cur
="${COMP_WORDS[COMP_CWORD]}"
698 __gitcomp
"$(git archive --list)" "" "${cur##--format=}"
702 __gitcomp
"$(__git_remotes)" "" "${cur##--remote=}"
707 --format= --list --verbose
708 --prefix= --remote= --exec=
718 __git_has_doubledash
&& return
720 local subcommands
="start bad good skip reset visualize replay log run"
721 local subcommand
="$(__git_find_subcommand "$subcommands")"
722 if [ -z "$subcommand" ]; then
723 __gitcomp
"$subcommands"
727 case "$subcommand" in
729 __gitcomp
"$(__git_refs)"
739 local i c
=1 only_local_ref
="n" has_r
="n"
741 while [ $c -lt $COMP_CWORD ]; do
744 -d|
-m) only_local_ref
="y" ;;
750 case "${COMP_WORDS[COMP_CWORD]}" in
753 --color --no-color --verbose --abbrev= --no-abbrev
754 --track --no-track --contains --merged --no-merged
758 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
759 __gitcomp
"$(__git_heads)"
761 __gitcomp
"$(__git_refs)"
769 local cmd
="${COMP_WORDS[2]}"
770 case "$COMP_CWORD" in
772 __gitcomp
"create list-heads verify unbundle"
780 __git_complete_revlist
789 __git_has_doubledash
&& return
791 __gitcomp
"$(__git_refs)"
796 __gitcomp
"$(__git_refs)"
801 local cur
="${COMP_WORDS[COMP_CWORD]}"
804 __gitcomp
"--edit --no-commit"
807 __gitcomp
"$(__git_refs)"
814 __git_has_doubledash
&& return
816 local cur
="${COMP_WORDS[COMP_CWORD]}"
819 __gitcomp
"--dry-run --quiet"
828 local cur
="${COMP_WORDS[COMP_CWORD]}"
853 __git_has_doubledash
&& return
855 local cur
="${COMP_WORDS[COMP_CWORD]}"
859 --all --author= --signoff --verify --no-verify
860 --edit --amend --include --only --interactive
869 local cur
="${COMP_WORDS[COMP_CWORD]}"
873 --all --tags --contains --abbrev= --candidates=
874 --exact-match --debug --long --match --always
878 __gitcomp
"$(__git_refs)"
881 __git_diff_common_options
="--stat --numstat --shortstat --summary
882 --patch-with-stat --name-only --name-status --color
883 --no-color --color-words --no-renames --check
884 --full-index --binary --abbrev --diff-filter=
886 --text --ignore-space-at-eol --ignore-space-change
887 --ignore-all-space --exit-code --quiet --ext-diff
889 --no-prefix --src-prefix= --dst-prefix=
890 --inter-hunk-context=
897 __git_has_doubledash
&& return
899 local cur
="${COMP_WORDS[COMP_CWORD]}"
902 __gitcomp
"--cached --staged --pickaxe-all --pickaxe-regex
903 --base --ours --theirs
904 $__git_diff_common_options
912 __git_fetch_options
="
913 --quiet --verbose --append --upload-pack --force --keep --depth=
919 local cur
="${COMP_WORDS[COMP_CWORD]}"
922 __gitcomp
"$__git_fetch_options"
926 __git_complete_remote_or_refspec
931 local cur
="${COMP_WORDS[COMP_CWORD]}"
936 " "" "${cur##--thread=}"
941 --stdout --attach --no-attach --thread --thread=
943 --numbered --start-number
948 --full-index --binary
951 --no-prefix --src-prefix= --dst-prefix=
952 --inline --suffix= --ignore-if-in-upstream
958 __git_complete_revlist
963 local cur
="${COMP_WORDS[COMP_CWORD]}"
967 --tags --root --unreachable --cache --no-reflogs --full
968 --strict --verbose --lost-found
978 local cur
="${COMP_WORDS[COMP_CWORD]}"
981 __gitcomp
"--prune --aggressive"
990 __git_has_doubledash
&& return
992 local cur
="${COMP_WORDS[COMP_CWORD]}"
997 --text --ignore-case --word-regexp --invert-match
999 --extended-regexp --basic-regexp --fixed-strings
1000 --files-with-matches --name-only
1001 --files-without-match
1003 --and --or --not --all-match
1013 local cur
="${COMP_WORDS[COMP_CWORD]}"
1016 __gitcomp
"--all --info --man --web"
1020 __gitcomp
"$(__git_all_commands)
1021 attributes cli core-tutorial cvs-migration
1022 diffcore gitk glossary hooks ignore modules
1023 repository-layout tutorial tutorial-2
1030 local cur
="${COMP_WORDS[COMP_CWORD]}"
1034 false true umask group all world everybody
1035 " "" "${cur##--shared=}"
1039 __gitcomp
"--quiet --bare --template= --shared --shared="
1048 __git_has_doubledash
&& return
1050 local cur
="${COMP_WORDS[COMP_CWORD]}"
1053 __gitcomp
"--cached --deleted --modified --others --ignored
1054 --stage --directory --no-empty-directory --unmerged
1055 --killed --exclude= --exclude-from=
1056 --exclude-per-directory= --exclude-standard
1057 --error-unmatch --with-tree= --full-name
1058 --abbrev --ignored --exclude-per-directory
1068 __gitcomp
"$(__git_remotes)"
1076 # Options that go well for log, shortlog and gitk
1077 __git_log_common_options
="
1079 --branches --tags --remotes
1080 --first-parent --no-merges
1082 --max-age= --since= --after=
1083 --min-age= --until= --before=
1085 # Options that go well for log and gitk (not shortlog)
1086 __git_log_gitk_options
="
1087 --dense --sparse --full-history
1088 --simplify-merges --simplify-by-decoration
1091 # Options that go well for log and shortlog (not gitk)
1092 __git_log_shortlog_options
="
1093 --author= --committer= --grep=
1097 __git_log_pretty_formats
="oneline short medium full fuller email raw format:"
1101 __git_has_doubledash
&& return
1103 local cur
="${COMP_WORDS[COMP_CWORD]}"
1104 local g
="$(git rev-parse --git-dir 2>/dev/null)"
1106 if [ -f $g/MERGE_HEAD
]; then
1111 __gitcomp
"$__git_log_pretty_formats
1112 " "" "${cur##--pretty=}"
1116 __gitcomp
"$__git_log_pretty_formats
1117 " "" "${cur##--format=}"
1122 relative iso8601 rfc2822 short local default
1123 " "" "${cur##--date=}"
1128 $__git_log_common_options
1129 $__git_log_shortlog_options
1130 $__git_log_gitk_options
1131 --root --topo-order --date-order --reverse
1133 --abbrev-commit --abbrev=
1134 --relative-date --date=
1135 --pretty= --format= --oneline
1140 --parents --children
1142 $__git_diff_common_options
1143 --pickaxe-all --pickaxe-regex
1148 __git_complete_revlist
1151 __git_merge_options
="
1152 --no-commit --no-stat --log --no-log --squash --strategy
1153 --commit --stat --no-squash --ff --no-ff
1158 __git_complete_strategy
&& return
1160 local cur
="${COMP_WORDS[COMP_CWORD]}"
1163 __gitcomp
"$__git_merge_options"
1166 __gitcomp
"$(__git_refs)"
1171 local cur
="${COMP_WORDS[COMP_CWORD]}"
1175 kdiff3 tkdiff meld xxdiff emerge
1176 vimdiff gvimdiff ecmerge opendiff
1177 " "" "${cur##--tool=}"
1190 __gitcomp
"$(__git_refs)"
1195 local cur
="${COMP_WORDS[COMP_CWORD]}"
1198 __gitcomp
"--dry-run"
1207 __gitcomp
"--tags --all --stdin"
1212 __git_complete_strategy
&& return
1214 local cur
="${COMP_WORDS[COMP_CWORD]}"
1218 --rebase --no-rebase
1219 $__git_merge_options
1220 $__git_fetch_options
1225 __git_complete_remote_or_refspec
1230 local cur
="${COMP_WORDS[COMP_CWORD]}"
1231 case "${COMP_WORDS[COMP_CWORD-1]}" in
1233 __gitcomp
"$(__git_remotes)"
1238 __gitcomp
"$(__git_remotes)" "" "${cur##--repo=}"
1243 --all --mirror --tags --dry-run --force --verbose
1244 --receive-pack= --repo=
1249 __git_complete_remote_or_refspec
1254 local cur
="${COMP_WORDS[COMP_CWORD]}" dir
="$(__gitdir)"
1255 if [ -d "$dir"/rebase-apply
] ||
[ -d "$dir"/rebase-merge
]; then
1256 __gitcomp
"--continue --skip --abort"
1259 __git_complete_strategy
&& return
1262 __gitcomp
"--onto --merge --strategy --interactive"
1265 __gitcomp
"$(__git_refs)"
1270 local cur
="${COMP_WORDS[COMP_CWORD]}"
1273 __gitcomp
"--annotate --bcc --cc --cc-cmd --chain-reply-to
1274 --compose --dry-run --envelope-sender --from --identity
1275 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1276 --no-suppress-from --no-thread --quiet
1277 --signed-off-by-cc --smtp-pass --smtp-server
1278 --smtp-server-port --smtp-ssl --smtp-user --subject
1279 --suppress-cc --suppress-from --thread --to
1280 --validate --no-validate"
1289 local cur
="${COMP_WORDS[COMP_CWORD]}"
1290 local prv
="${COMP_WORDS[COMP_CWORD-1]}"
1293 __gitcomp
"$(__git_remotes)"
1297 __gitcomp
"$(__git_refs)"
1301 local remote
="${prv#remote.}"
1302 remote
="${remote%.fetch}"
1303 __gitcomp
"$(__git_refs_remotes "$remote")"
1307 local remote
="${prv#remote.}"
1308 remote
="${remote%.push}"
1309 __gitcomp
"$(git --git-dir="$
(__gitdir
)" \
1310 for-each-ref --format='%(refname):%(refname)' \
1314 pull.twohead|pull.octopus
)
1315 __gitcomp
"$(__git_merge_strategies)"
1318 color.branch|color.
diff|color.interactive|color.status|color.ui
)
1319 __gitcomp
"always never auto"
1323 __gitcomp
"false true"
1328 normal black red green yellow blue magenta cyan white
1329 bold dim ul blink reverse
1341 --global --system --file=
1342 --list --replace-all
1343 --get --get-all --get-regexp
1344 --add --unset --unset-all
1345 --remove-section --rename-section
1350 local pfx
="${cur%.*}."
1352 __gitcomp
"remote merge mergeoptions" "$pfx" "$cur"
1356 local pfx
="${cur%.*}."
1358 __gitcomp
"$(__git_heads)" "$pfx" "$cur" "."
1362 local pfx
="${cur%.*}."
1365 url proxy fetch push mirror skipDefaultUpdate
1366 receivepack uploadpack tagopt
1371 local pfx
="${cur%.*}."
1373 __gitcomp
"$(__git_remotes)" "$pfx" "$cur" "."
1379 branch.autosetupmerge
1380 branch.autosetuprebase
1383 color.branch.current
1394 color.diff.whitespace
1396 color.interactive.header
1397 color.interactive.help
1398 color.interactive.prompt
1402 color.status.changed
1404 color.status.nobranch
1405 color.status.untracked
1406 color.status.updated
1412 core.deltaBaseCacheLimit
1416 core.fsyncobjectfiles
1418 core.ignoreCygwinFSTricks
1420 core.logAllRefUpdates
1421 core.loosecompression
1423 core.packedGitWindowSize
1425 core.preferSymlinkRefs
1428 core.repositoryFormatVersion
1430 core.sharedRepository
1433 core.warnAmbiguousRefs
1436 diff.autorefreshindex
1453 gc.reflogexpireunreachable
1457 gitcvs.dbTableNamePrefix
1467 gui.copyblamethreshold
1471 gui.matchtrackingbranch
1472 gui.newbranchtemplate
1473 gui.pruneduringfetch
1474 gui.spellingdictionary
1490 i18n.logOutputEncoding
1505 mergetool.keepBackup
1507 pack.deltaCacheLimit
1517 receive.denyCurrentBranch
1519 receive.denyNonFastForwards
1522 repack.usedeltabaseoffset
1526 status.relativePaths
1527 status.showUntrackedFiles
1529 transfer.unpackLimit
1540 local subcommands
="add rename rm show prune update set-head"
1541 local subcommand
="$(__git_find_subcommand "$subcommands")"
1542 if [ -z "$subcommand" ]; then
1543 __gitcomp
"$subcommands"
1547 case "$subcommand" in
1548 rename|
rm|show|prune
)
1549 __gitcomp
"$(__git_remotes)"
1552 local i c
='' IFS
=$
'\n'
1553 for i
in $
(git
--git-dir="$(__gitdir)" config
--list); do
1571 __git_has_doubledash
&& return
1573 local cur
="${COMP_WORDS[COMP_CWORD]}"
1576 __gitcomp
"--merge --mixed --hard --soft"
1580 __gitcomp
"$(__git_refs)"
1585 local cur
="${COMP_WORDS[COMP_CWORD]}"
1588 __gitcomp
"--edit --mainline --no-edit --no-commit --signoff"
1592 __gitcomp
"$(__git_refs)"
1597 __git_has_doubledash
&& return
1599 local cur
="${COMP_WORDS[COMP_CWORD]}"
1602 __gitcomp
"--cached --dry-run --ignore-unmatch --quiet"
1611 __git_has_doubledash
&& return
1613 local cur
="${COMP_WORDS[COMP_CWORD]}"
1617 $__git_log_common_options
1618 $__git_log_shortlog_options
1619 --numbered --summary
1624 __git_complete_revlist
1629 __git_has_doubledash
&& return
1631 local cur
="${COMP_WORDS[COMP_CWORD]}"
1634 __gitcomp
"$__git_log_pretty_formats
1635 " "" "${cur##--pretty=}"
1639 __gitcomp
"$__git_log_pretty_formats
1640 " "" "${cur##--format=}"
1644 __gitcomp
"--pretty= --format=
1645 $__git_diff_common_options
1655 local cur
="${COMP_WORDS[COMP_CWORD]}"
1659 --all --remotes --topo-order --current --more=
1660 --list --independent --merge-base --no-name
1661 --sha1-name --topics --reflog
1666 __git_complete_revlist
1671 local subcommands
='save list show apply clear drop pop create branch'
1672 local subcommand
="$(__git_find_subcommand "$subcommands")"
1673 if [ -z "$subcommand" ]; then
1674 __gitcomp
"$subcommands"
1676 local cur
="${COMP_WORDS[COMP_CWORD]}"
1677 case "$subcommand,$cur" in
1679 __gitcomp
"--keep-index"
1684 show
,--*|drop
,--*|pop
,--*|branch
,--*)
1687 show
,*|apply
,*|drop
,*|pop
,*|branch
,*)
1688 __gitcomp
"$(git --git-dir="$
(__gitdir
)" stash list \
1689 | sed -n -e 's/:.*//p')"
1700 __git_has_doubledash
&& return
1702 local subcommands
="add status init update summary foreach sync"
1703 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1704 local cur
="${COMP_WORDS[COMP_CWORD]}"
1707 __gitcomp
"--quiet --cached"
1710 __gitcomp
"$subcommands"
1720 init fetch clone rebase dcommit log find-rev
1721 set-tree commit-diff info create-ignore propget
1722 proplist show-ignore show-externals branch tag blame
1725 local subcommand
="$(__git_find_subcommand "$subcommands")"
1726 if [ -z "$subcommand" ]; then
1727 __gitcomp
"$subcommands"
1729 local remote_opts
="--username= --config-dir= --no-auth-cache"
1731 --follow-parent --authors-file= --repack=
1732 --no-metadata --use-svm-props --use-svnsync-props
1733 --log-window-size= --no-checkout --quiet
1734 --repack-flags --use-log-author --localtime
1735 --ignore-paths= $remote_opts
1738 --template= --shared= --trunk= --tags=
1739 --branches= --stdlayout --minimize-url
1740 --no-metadata --use-svm-props --use-svnsync-props
1741 --rewrite-root= --prefix= --use-log-author
1742 --add-author-from $remote_opts
1745 --edit --rmdir --find-copies-harder --copy-similarity=
1748 local cur
="${COMP_WORDS[COMP_CWORD]}"
1749 case "$subcommand,$cur" in
1751 __gitcomp
"--revision= --fetch-all $fc_opts"
1754 __gitcomp
"--revision= $fc_opts $init_opts"
1757 __gitcomp
"$init_opts"
1761 --merge --strategy= --verbose --dry-run
1762 --fetch-all --no-rebase --commit-url
1763 --revision $cmt_opts $fc_opts
1767 __gitcomp
"--stdin $cmt_opts $fc_opts"
1769 create-ignore
,--*|propget
,--*|proplist
,--*|show-ignore
,--*|\
1771 __gitcomp
"--revision="
1775 --limit= --revision= --verbose --incremental
1776 --oneline --show-commit --non-recursive
1777 --authors-file= --color
1782 --merge --verbose --strategy= --local
1783 --fetch-all --dry-run $fc_opts
1787 __gitcomp
"--message= --file= --revision= $cmt_opts"
1793 __gitcomp
"--dry-run --message --tag"
1796 __gitcomp
"--dry-run --message"
1799 __gitcomp
"--git-format"
1803 --config-dir= --ignore-paths= --minimize
1804 --no-auth-cache --username=
1817 while [ $c -lt $COMP_CWORD ]; do
1818 i
="${COMP_WORDS[c]}"
1821 __gitcomp
"$(__git_tags)"
1831 case "${COMP_WORDS[COMP_CWORD-1]}" in
1837 __gitcomp
"$(__git_tags)"
1843 __gitcomp
"$(__git_refs)"
1850 local i c
=1 command __git_dir
1852 while [ $c -lt $COMP_CWORD ]; do
1853 i
="${COMP_WORDS[c]}"
1855 --git-dir=*) __git_dir
="${i#--git-dir=}" ;;
1856 --bare) __git_dir
="." ;;
1857 --version|
-p|
--paginate) ;;
1858 --help) command="help"; break ;;
1859 *) command="$i"; break ;;
1864 if [ -z "$command" ]; then
1865 case "${COMP_WORDS[COMP_CWORD]}" in
1877 *) __gitcomp
"$(__git_porcelain_commands) $(__git_aliases)" ;;
1882 local expansion
=$
(__git_aliased_command
"$command")
1883 [ "$expansion" ] && command="$expansion"
1888 apply
) _git_apply
;;
1889 archive
) _git_archive
;;
1890 bisect
) _git_bisect
;;
1891 bundle
) _git_bundle
;;
1892 branch
) _git_branch
;;
1893 checkout
) _git_checkout
;;
1894 cherry
) _git_cherry
;;
1895 cherry-pick
) _git_cherry_pick
;;
1896 clean
) _git_clean
;;
1897 clone
) _git_clone
;;
1898 commit
) _git_commit
;;
1899 config
) _git_config
;;
1900 describe
) _git_describe
;;
1902 fetch
) _git_fetch
;;
1903 format-patch
) _git_format_patch
;;
1910 ls-files
) _git_ls_files
;;
1911 ls-remote
) _git_ls_remote
;;
1912 ls-tree
) _git_ls_tree
;;
1914 mergetool
) _git_mergetool
;;
1915 merge-base
) _git_merge_base
;;
1917 name-rev
) _git_name_rev
;;
1920 rebase
) _git_rebase
;;
1921 remote
) _git_remote
;;
1922 reset) _git_reset
;;
1923 revert
) _git_revert
;;
1925 send-email
) _git_send_email
;;
1926 shortlog
) _git_shortlog
;;
1928 show-branch
) _git_show_branch
;;
1929 stash
) _git_stash
;;
1931 submodule
) _git_submodule
;;
1934 whatchanged
) _git_log
;;
1941 __git_has_doubledash
&& return
1943 local cur
="${COMP_WORDS[COMP_CWORD]}"
1944 local g
="$(__gitdir)"
1946 if [ -f $g/MERGE_HEAD
]; then
1952 $__git_log_common_options
1953 $__git_log_gitk_options
1959 __git_complete_revlist
1962 complete
-o bashdefault
-o default
-o nospace
-F _git git
2>/dev
/null \
1963 || complete
-o default
-o nospace
-F _git git
1964 complete
-o bashdefault
-o default
-o nospace
-F _gitk gitk
2>/dev
/null \
1965 || complete
-o default
-o nospace
-F _gitk gitk
1967 # The following are necessary only for Cygwin, and only are needed
1968 # when the user has tab-completed the executable name and consequently
1969 # included the '.exe' suffix.
1971 if [ Cygwin
= "$(uname -o 2>/dev/null)" ]; then
1972 complete
-o bashdefault
-o default
-o nospace
-F _git git.exe
2>/dev
/null \
1973 || complete
-o default
-o nospace
-F _git git.exe