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.
39 # *) Read Documentation/SubmittingPatches
40 # *) Send all patches to the current maintainer:
42 # "Shawn O. Pearce" <spearce@spearce.org>
44 # *) Always CC the Git mailing list:
49 case "$COMP_WORDBREAKS" in
51 *) COMP_WORDBREAKS
="$COMP_WORDBREAKS:"
54 # __gitdir accepts 0 or 1 arguments (i.e., location)
55 # returns location of .git repo
58 if [ -z "${1-}" ]; then
59 if [ -n "$__git_dir" ]; then
61 elif [ -d .git
]; then
64 git rev-parse
--git-dir 2>/dev
/null
66 elif [ -d "$1/.git" ]; then
73 # __git_ps1 accepts 0 or 1 arguments (i.e., format string)
74 # returns text to add to bash PS1 prompt (includes branch name)
77 local g
="$(git rev-parse --git-dir 2>/dev/null)"
81 if [ -d "$g/rebase-apply" ]
83 if test -f "$g/rebase-apply/rebasing"
86 elif test -f "$g/rebase-apply/applying"
92 b
="$(git symbolic-ref HEAD 2>/dev/null)"
93 elif [ -f "$g/rebase-merge/interactive" ]
96 b
="$(cat "$g/rebase-merge
/head-name
")"
97 elif [ -d "$g/rebase-merge" ]
100 b
="$(cat "$g/rebase-merge
/head-name
")"
101 elif [ -f "$g/MERGE_HEAD" ]
104 b
="$(git symbolic-ref HEAD 2>/dev/null)"
106 if [ -f "$g/BISECT_LOG" ]
110 if ! b
="$(git symbolic-ref HEAD 2>/dev/null)"
112 if ! b
="$(git describe --exact-match HEAD 2>/dev/null)"
114 b
="$(cut -c1-7 "$g/HEAD
")..."
119 if [ -n "${1-}" ]; then
120 printf "$1" "${b##refs/heads/}$r"
122 printf " (%s)" "${b##refs/heads/}$r"
127 # __gitcomp_1 requires 2 arguments
130 local c IFS
=' '$
'\t'$
'\n'
133 --*=*) printf %s$
'\n' "$c$2" ;;
134 *.
) printf %s$
'\n' "$c$2" ;;
135 *) printf %s$
'\n' "$c$2 " ;;
140 # __gitcomp accepts 1, 2, 3, or 4 arguments
141 # generates completion reply with compgen
144 local cur
="${COMP_WORDS[COMP_CWORD]}"
145 if [ $# -gt 2 ]; then
154 COMPREPLY
=($
(compgen
-P "${2-}" \
155 -W "$(__gitcomp_1 "${1-}" "${4-}")" \
161 # __git_heads accepts 0 or 1 arguments (to pass to __gitdir)
164 local cmd i is_hash
=y dir
="$(__gitdir "${1-}")"
165 if [ -d "$dir" ]; then
166 git
--git-dir="$dir" for-each-ref
--format='%(refname:short)' \
170 for i
in $
(git ls-remote
"${1-}" 2>/dev
/null
); do
171 case "$is_hash,$i" in
174 n
,refs
/heads
/*) is_hash
=y
; echo "${i#refs/heads/}" ;;
175 n
,*) is_hash
=y
; echo "$i" ;;
180 # __git_tags accepts 0 or 1 arguments (to pass to __gitdir)
183 local cmd i is_hash
=y dir
="$(__gitdir "${1-}")"
184 if [ -d "$dir" ]; then
185 git
--git-dir="$dir" for-each-ref
--format='%(refname:short)' \
189 for i
in $
(git ls-remote
"${1-}" 2>/dev
/null
); do
190 case "$is_hash,$i" in
193 n
,refs
/tags
/*) is_hash
=y
; echo "${i#refs/tags/}" ;;
194 n
,*) is_hash
=y
; echo "$i" ;;
199 # __git_refs accepts 0 or 1 arguments (to pass to __gitdir)
202 local i is_hash
=y dir
="$(__gitdir "${1-}")"
203 local cur
="${COMP_WORDS[COMP_CWORD]}" format refs
204 if [ -d "$dir" ]; then
211 if [ -e "$dir/HEAD" ]; then echo HEAD
; fi
212 format
="refname:short"
213 refs
="refs/tags refs/heads refs/remotes"
216 git
--git-dir="$dir" for-each-ref
--format="%($format)" \
220 for i
in $
(git ls-remote
"$dir" 2>/dev
/null
); do
221 case "$is_hash,$i" in
224 n
,refs
/tags
/*) is_hash
=y
; echo "${i#refs/tags/}" ;;
225 n
,refs
/heads
/*) is_hash
=y
; echo "${i#refs/heads/}" ;;
226 n
,refs
/remotes
/*) is_hash
=y
; echo "${i#refs/remotes/}" ;;
227 n
,*) is_hash
=y
; echo "$i" ;;
232 # __git_refs2 requires 1 argument (to pass to __git_refs)
236 for i
in $
(__git_refs
"$1"); do
241 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
242 __git_refs_remotes
()
244 local cmd i is_hash
=y
245 for i
in $
(git ls-remote
"$1" 2>/dev
/null
); do
246 case "$is_hash,$i" in
249 echo "$i:refs/remotes/$1/${i#refs/heads/}"
253 n
,refs
/tags
/*) is_hash
=y
;;
261 local i ngoff IFS
=$
'\n' d
="$(__gitdir)"
262 shopt -q nullglob || ngoff
=1
264 for i
in "$d/remotes"/*; do
265 echo ${i#$d/remotes/}
267 [ "$ngoff" ] && shopt -u nullglob
268 for i
in $
(git
--git-dir="$d" config
--list); do
278 __git_merge_strategies
()
280 if [ -n "$__git_merge_strategylist" ]; then
281 echo "$__git_merge_strategylist"
284 git merge
-s help 2>&1 |
285 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
293 __git_merge_strategylist
=
294 __git_merge_strategylist
=$
(__git_merge_strategies
2>/dev
/null
)
296 __git_complete_file
()
298 local pfx
ls ref cur
="${COMP_WORDS[COMP_CWORD]}"
315 case "$COMP_WORDBREAKS" in
317 *) pfx
="$ref:$pfx" ;;
321 COMPREPLY
=($
(compgen
-P "$pfx" \
322 -W "$(git --git-dir="$
(__gitdir
)" ls-tree "$ls" \
323 | sed '/^100... blob /{
339 __gitcomp
"$(__git_refs)"
344 __git_complete_revlist
()
346 local pfx cur
="${COMP_WORDS[COMP_CWORD]}"
351 __gitcomp
"$(__git_refs)" "$pfx" "$cur"
356 __gitcomp
"$(__git_refs)" "$pfx" "$cur"
359 __gitcomp
"$(__git_refs)"
364 __git_all_commands
()
366 if [ -n "$__git_all_commandlist" ]; then
367 echo "$__git_all_commandlist"
371 for i
in $
(git
help -a|
egrep '^ ')
374 *--*) : helper pattern
;;
379 __git_all_commandlist
=
380 __git_all_commandlist
="$(__git_all_commands 2>/dev/null)"
382 __git_porcelain_commands
()
384 if [ -n "$__git_porcelain_commandlist" ]; then
385 echo "$__git_porcelain_commandlist"
389 for i
in "help" $
(__git_all_commands
)
392 *--*) : helper pattern
;;
393 applymbox
) : ask gittus
;;
394 applypatch
) : ask gittus
;;
395 archimport
) : import
;;
396 cat-file
) : plumbing
;;
397 check-attr
) : plumbing
;;
398 check-ref-format
) : plumbing
;;
399 checkout-index
) : plumbing
;;
400 commit-tree
) : plumbing
;;
401 count-objects
) : infrequent
;;
402 cvsexportcommit
) : export;;
403 cvsimport
) : import
;;
404 cvsserver
) : daemon
;;
406 diff-files
) : plumbing
;;
407 diff-index
) : plumbing
;;
408 diff-tree
) : plumbing
;;
409 fast-import
) : import
;;
410 fast-export
) : export;;
411 fsck-objects
) : plumbing
;;
412 fetch-pack
) : plumbing
;;
413 fmt-merge-msg
) : plumbing
;;
414 for-each-ref
) : plumbing
;;
415 hash-object
) : plumbing
;;
416 http-
*) : transport
;;
417 index-pack
) : plumbing
;;
418 init-db
) : deprecated
;;
419 local-fetch
) : plumbing
;;
420 lost-found
) : infrequent
;;
421 ls-files
) : plumbing
;;
422 ls-remote
) : plumbing
;;
423 ls-tree
) : plumbing
;;
424 mailinfo
) : plumbing
;;
425 mailsplit
) : plumbing
;;
426 merge-
*) : plumbing
;;
429 pack-objects
) : plumbing
;;
430 pack-redundant
) : plumbing
;;
431 pack-refs
) : plumbing
;;
432 parse-remote
) : plumbing
;;
433 patch-id
) : plumbing
;;
434 peek-remote
) : plumbing
;;
436 prune-packed
) : plumbing
;;
437 quiltimport
) : import
;;
438 read-tree
) : plumbing
;;
439 receive-pack
) : plumbing
;;
441 repo-config
) : deprecated
;;
443 rev-list
) : plumbing
;;
444 rev-parse
) : plumbing
;;
445 runstatus
) : plumbing
;;
446 sh-setup
) : internal
;;
448 show-ref
) : plumbing
;;
449 send-pack
) : plumbing
;;
450 show-index
) : plumbing
;;
452 stripspace
) : plumbing
;;
453 symbolic-ref
) : plumbing
;;
454 tar-tree
) : deprecated
;;
455 unpack-file
) : plumbing
;;
456 unpack-objects
) : plumbing
;;
457 update-index
) : plumbing
;;
458 update-ref
) : plumbing
;;
459 update-server-info
) : daemon
;;
460 upload-archive
) : plumbing
;;
461 upload-pack
) : plumbing
;;
462 write-tree
) : plumbing
;;
464 verify-pack
) : infrequent
;;
465 verify-tag
) : plumbing
;;
470 __git_porcelain_commandlist
=
471 __git_porcelain_commandlist
="$(__git_porcelain_commands 2>/dev/null)"
476 for i
in $
(git
--git-dir="$(__gitdir)" config
--list); do
486 # __git_aliased_command requires 1 argument
487 __git_aliased_command
()
489 local word cmdline
=$
(git
--git-dir="$(__gitdir)" \
490 config
--get "alias.$1")
491 for word
in $cmdline; do
492 if [ "${word##-*}" ]; then
499 # __git_find_subcommand requires 1 argument
500 __git_find_subcommand
()
502 local word subcommand c
=1
504 while [ $c -lt $COMP_CWORD ]; do
505 word
="${COMP_WORDS[c]}"
506 for subcommand
in $1; do
507 if [ "$subcommand" = "$word" ]; then
516 __git_has_doubledash
()
519 while [ $c -lt $COMP_CWORD ]; do
520 if [ "--" = "${COMP_WORDS[c]}" ]; then
528 __git_whitespacelist
="nowarn warn error error-all fix"
532 local cur
="${COMP_WORDS[COMP_CWORD]}" dir
="$(__gitdir)"
533 if [ -d "$dir"/rebase-apply
]; then
534 __gitcomp
"--skip --resolved --abort"
539 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
544 --signoff --utf8 --binary --3way --interactive
554 local cur
="${COMP_WORDS[COMP_CWORD]}"
557 __gitcomp
"$__git_whitespacelist" "" "${cur##--whitespace=}"
562 --stat --numstat --summary --check --index
563 --cached --index-info --reverse --reject --unidiff-zero
564 --apply --no-add --exclude=
565 --whitespace= --inaccurate-eof --verbose
574 __git_has_doubledash
&& return
576 local cur
="${COMP_WORDS[COMP_CWORD]}"
580 --interactive --refresh --patch --update --dry-run
581 --ignore-errors --intent-to-add
590 local cur
="${COMP_WORDS[COMP_CWORD]}"
593 __gitcomp
"$(git archive --list)" "" "${cur##--format=}"
597 __gitcomp
"$(__git_remotes)" "" "${cur##--remote=}"
602 --format= --list --verbose
603 --prefix= --remote= --exec=
613 __git_has_doubledash
&& return
615 local subcommands
="start bad good skip reset visualize replay log run"
616 local subcommand
="$(__git_find_subcommand "$subcommands")"
617 if [ -z "$subcommand" ]; then
618 __gitcomp
"$subcommands"
622 case "$subcommand" in
624 __gitcomp
"$(__git_refs)"
634 local i c
=1 only_local_ref
="n" has_r
="n"
636 while [ $c -lt $COMP_CWORD ]; do
639 -d|
-m) only_local_ref
="y" ;;
645 case "${COMP_WORDS[COMP_CWORD]}" in
648 --color --no-color --verbose --abbrev= --no-abbrev
649 --track --no-track --contains --merged --no-merged
653 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
654 __gitcomp
"$(__git_heads)"
656 __gitcomp
"$(__git_refs)"
664 local cmd
="${COMP_WORDS[2]}"
665 case "$COMP_CWORD" in
667 __gitcomp
"create list-heads verify unbundle"
675 __git_complete_revlist
684 __git_has_doubledash
&& return
686 __gitcomp
"$(__git_refs)"
691 __gitcomp
"$(__git_refs)"
696 local cur
="${COMP_WORDS[COMP_CWORD]}"
699 __gitcomp
"--edit --no-commit"
702 __gitcomp
"$(__git_refs)"
709 __git_has_doubledash
&& return
711 local cur
="${COMP_WORDS[COMP_CWORD]}"
714 __gitcomp
"--dry-run --quiet"
723 local cur
="${COMP_WORDS[COMP_CWORD]}"
748 __git_has_doubledash
&& return
750 local cur
="${COMP_WORDS[COMP_CWORD]}"
754 --all --author= --signoff --verify --no-verify
755 --edit --amend --include --only --interactive
764 local cur
="${COMP_WORDS[COMP_CWORD]}"
768 --all --tags --contains --abbrev= --candidates=
769 --exact-match --debug --long --match --always
773 __gitcomp
"$(__git_refs)"
778 __git_has_doubledash
&& return
780 local cur
="${COMP_WORDS[COMP_CWORD]}"
783 __gitcomp
"--cached --stat --numstat --shortstat --summary
784 --patch-with-stat --name-only --name-status --color
785 --no-color --color-words --no-renames --check
786 --full-index --binary --abbrev --diff-filter=
787 --find-copies-harder --pickaxe-all --pickaxe-regex
788 --text --ignore-space-at-eol --ignore-space-change
789 --ignore-all-space --exit-code --quiet --ext-diff
791 --no-prefix --src-prefix= --dst-prefix=
792 --base --ours --theirs
793 --inter-hunk-context=
803 local cur
="${COMP_WORDS[COMP_CWORD]}"
805 if [ "$COMP_CWORD" = 2 ]; then
806 __gitcomp
"$(__git_remotes)"
811 case "$COMP_WORDBREAKS" in
813 *) pfx
="${cur%%:*}:" ;;
815 __gitcomp
"$(__git_refs)" "$pfx" "${cur#*:}"
818 __gitcomp
"$(__git_refs2 "${COMP_WORDS[2]}")"
826 local cur
="${COMP_WORDS[COMP_CWORD]}"
830 --stdout --attach --thread
832 --numbered --start-number
837 --full-index --binary
840 --no-prefix --src-prefix= --dst-prefix=
845 __git_complete_revlist
850 local cur
="${COMP_WORDS[COMP_CWORD]}"
853 __gitcomp
"--prune --aggressive"
862 __git_has_doubledash
&& return
864 local cur
="${COMP_WORDS[COMP_CWORD]}"
869 --text --ignore-case --word-regexp --invert-match
871 --extended-regexp --basic-regexp --fixed-strings
872 --files-with-matches --name-only
873 --files-without-match
875 --and --or --not --all-match
885 local cur
="${COMP_WORDS[COMP_CWORD]}"
888 __gitcomp
"--all --info --man --web"
892 __gitcomp
"$(__git_all_commands)
893 attributes cli core-tutorial cvs-migration
894 diffcore gitk glossary hooks ignore modules
895 repository-layout tutorial tutorial-2
902 local cur
="${COMP_WORDS[COMP_CWORD]}"
906 false true umask group all world everybody
907 " "" "${cur##--shared=}"
911 __gitcomp
"--quiet --bare --template= --shared --shared="
920 __git_has_doubledash
&& return
922 local cur
="${COMP_WORDS[COMP_CWORD]}"
925 __gitcomp
"--cached --deleted --modified --others --ignored
926 --stage --directory --no-empty-directory --unmerged
927 --killed --exclude= --exclude-from=
928 --exclude-per-directory= --exclude-standard
929 --error-unmatch --with-tree= --full-name
930 --abbrev --ignored --exclude-per-directory
940 __gitcomp
"$(__git_remotes)"
950 __git_has_doubledash
&& return
952 local cur
="${COMP_WORDS[COMP_CWORD]}"
956 oneline short medium full fuller email raw
957 " "" "${cur##--pretty=}"
962 relative iso8601 rfc2822 short local default
963 " "" "${cur##--date=}"
968 --max-count= --max-age= --since= --after=
969 --min-age= --before= --until=
970 --root --topo-order --date-order --reverse
972 --abbrev-commit --abbrev=
973 --relative-date --date=
974 --author= --committer= --grep=
976 --pretty= --name-status --name-only --raw
978 --left-right --cherry-pick
980 --stat --numstat --shortstat
981 --decorate --diff-filter=
982 --color-words --walk-reflogs
983 --parents --children --full-history
985 --inter-hunk-context=
990 __git_complete_revlist
995 local cur
="${COMP_WORDS[COMP_CWORD]}"
996 case "${COMP_WORDS[COMP_CWORD-1]}" in
998 __gitcomp
"$(__git_merge_strategies)"
1003 __gitcomp
"$(__git_merge_strategies)" "" "${cur##--strategy=}"
1008 --no-commit --no-stat --log --no-log --squash --strategy
1012 __gitcomp
"$(__git_refs)"
1017 local cur
="${COMP_WORDS[COMP_CWORD]}"
1021 kdiff3 tkdiff meld xxdiff emerge
1022 vimdiff gvimdiff ecmerge opendiff
1023 " "" "${cur##--tool=}"
1036 __gitcomp
"$(__git_refs)"
1041 local cur
="${COMP_WORDS[COMP_CWORD]}"
1044 __gitcomp
"--dry-run"
1053 __gitcomp
"--tags --all --stdin"
1058 local cur
="${COMP_WORDS[COMP_CWORD]}"
1060 if [ "$COMP_CWORD" = 2 ]; then
1061 __gitcomp
"$(__git_remotes)"
1063 __gitcomp
"$(__git_refs "${COMP_WORDS[2]}")"
1069 local cur
="${COMP_WORDS[COMP_CWORD]}"
1071 if [ "$COMP_CWORD" = 2 ]; then
1072 __gitcomp
"$(__git_remotes)"
1077 case "$COMP_WORDBREAKS" in
1079 *) pfx
="${cur%%:*}:" ;;
1082 __gitcomp
"$(__git_refs "${COMP_WORDS[2]}")" "$pfx" "${cur#*:}"
1085 __gitcomp
"$(__git_refs)" + "${cur#+}"
1088 __gitcomp
"$(__git_refs)"
1096 local cur
="${COMP_WORDS[COMP_CWORD]}" dir
="$(__gitdir)"
1097 if [ -d "$dir"/rebase-apply
] ||
[ -d "$dir"/rebase-merge
]; then
1098 __gitcomp
"--continue --skip --abort"
1101 case "${COMP_WORDS[COMP_CWORD-1]}" in
1103 __gitcomp
"$(__git_merge_strategies)"
1108 __gitcomp
"$(__git_merge_strategies)" "" "${cur##--strategy=}"
1112 __gitcomp
"--onto --merge --strategy --interactive"
1115 __gitcomp
"$(__git_refs)"
1120 local cur
="${COMP_WORDS[COMP_CWORD]}"
1123 __gitcomp
"--bcc --cc --cc-cmd --chain-reply-to --compose
1124 --dry-run --envelope-sender --from --identity
1125 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1126 --no-suppress-from --no-thread --quiet
1127 --signed-off-by-cc --smtp-pass --smtp-server
1128 --smtp-server-port --smtp-ssl --smtp-user --subject
1129 --suppress-cc --suppress-from --thread --to
1130 --validate --no-validate"
1139 local cur
="${COMP_WORDS[COMP_CWORD]}"
1140 local prv
="${COMP_WORDS[COMP_CWORD-1]}"
1143 __gitcomp
"$(__git_remotes)"
1147 __gitcomp
"$(__git_refs)"
1151 local remote
="${prv#remote.}"
1152 remote
="${remote%.fetch}"
1153 __gitcomp
"$(__git_refs_remotes "$remote")"
1157 local remote
="${prv#remote.}"
1158 remote
="${remote%.push}"
1159 __gitcomp
"$(git --git-dir="$
(__gitdir
)" \
1160 for-each-ref --format='%(refname):%(refname)' \
1164 pull.twohead|pull.octopus
)
1165 __gitcomp
"$(__git_merge_strategies)"
1168 color.branch|color.
diff|color.status
)
1169 __gitcomp
"always never auto"
1174 normal black red green yellow blue magenta cyan white
1175 bold dim ul blink reverse
1187 --global --system --file=
1188 --list --replace-all
1189 --get --get-all --get-regexp
1190 --add --unset --unset-all
1191 --remove-section --rename-section
1196 local pfx
="${cur%.*}."
1198 __gitcomp
"remote merge mergeoptions" "$pfx" "$cur"
1202 local pfx
="${cur%.*}."
1204 __gitcomp
"$(__git_heads)" "$pfx" "$cur" "."
1208 local pfx
="${cur%.*}."
1211 url proxy fetch push mirror skipDefaultUpdate
1212 receivepack uploadpack tagopt
1217 local pfx
="${cur%.*}."
1219 __gitcomp
"$(__git_remotes)" "$pfx" "$cur" "."
1225 branch.autosetupmerge
1226 branch.autosetuprebase
1229 color.branch.current
1240 color.diff.whitespace
1242 color.interactive.header
1243 color.interactive.help
1244 color.interactive.prompt
1248 color.status.changed
1250 color.status.nobranch
1251 color.status.untracked
1252 color.status.updated
1258 core.deltaBaseCacheLimit
1262 core.fsyncobjectfiles
1264 core.ignoreCygwinFSTricks
1266 core.logAllRefUpdates
1267 core.loosecompression
1269 core.packedGitWindowSize
1271 core.preferSymlinkRefs
1274 core.repositoryFormatVersion
1276 core.sharedRepository
1279 core.warnAmbiguousRefs
1282 diff.autorefreshindex
1299 gc.reflogexpireunreachable
1303 gitcvs.dbTableNamePrefix
1313 gui.copyblamethreshold
1317 gui.matchtrackingbranch
1318 gui.newbranchtemplate
1319 gui.pruneduringfetch
1320 gui.spellingdictionary
1336 i18n.logOutputEncoding
1351 mergetool.keepBackup
1353 pack.deltaCacheLimit
1363 receive.denyCurrentBranch
1365 receive.denyNonFastForwards
1368 repack.usedeltabaseoffset
1372 status.relativePaths
1373 status.showUntrackedFiles
1375 transfer.unpackLimit
1386 local subcommands
="add rm show prune update"
1387 local subcommand
="$(__git_find_subcommand "$subcommands")"
1388 if [ -z "$subcommand" ]; then
1389 __gitcomp
"$subcommands"
1393 case "$subcommand" in
1395 __gitcomp
"$(__git_remotes)"
1398 local i c
='' IFS
=$
'\n'
1399 for i
in $
(git
--git-dir="$(__gitdir)" config
--list); do
1417 __git_has_doubledash
&& return
1419 local cur
="${COMP_WORDS[COMP_CWORD]}"
1422 __gitcomp
"--merge --mixed --hard --soft"
1426 __gitcomp
"$(__git_refs)"
1431 local cur
="${COMP_WORDS[COMP_CWORD]}"
1434 __gitcomp
"--edit --mainline --no-edit --no-commit --signoff"
1438 __gitcomp
"$(__git_refs)"
1443 __git_has_doubledash
&& return
1445 local cur
="${COMP_WORDS[COMP_CWORD]}"
1448 __gitcomp
"--cached --dry-run --ignore-unmatch --quiet"
1457 __git_has_doubledash
&& return
1459 local cur
="${COMP_WORDS[COMP_CWORD]}"
1463 --max-count= --max-age= --since= --after=
1464 --min-age= --before= --until=
1466 --author= --committer= --grep=
1469 --numbered --summary
1474 __git_complete_revlist
1479 __git_has_doubledash
&& return
1481 local cur
="${COMP_WORDS[COMP_CWORD]}"
1485 oneline short medium full fuller email raw
1486 " "" "${cur##--pretty=}"
1490 __gitcomp
"--pretty="
1499 local cur
="${COMP_WORDS[COMP_CWORD]}"
1503 --all --remotes --topo-order --current --more=
1504 --list --independent --merge-base --no-name
1505 --sha1-name --topics --reflog
1510 __git_complete_revlist
1515 local subcommands
='save list show apply clear drop pop create branch'
1516 local subcommand
="$(__git_find_subcommand "$subcommands")"
1517 if [ -z "$subcommand" ]; then
1518 __gitcomp
"$subcommands"
1520 local cur
="${COMP_WORDS[COMP_CWORD]}"
1521 case "$subcommand,$cur" in
1523 __gitcomp
"--keep-index"
1528 show
,--*|drop
,--*|pop
,--*|branch
,--*)
1531 show
,*|apply
,*|drop
,*|pop
,*|branch
,*)
1532 __gitcomp
"$(git --git-dir="$
(__gitdir
)" stash list \
1533 | sed -n -e 's/:.*//p')"
1544 __git_has_doubledash
&& return
1546 local subcommands
="add status init update summary foreach sync"
1547 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1548 local cur
="${COMP_WORDS[COMP_CWORD]}"
1551 __gitcomp
"--quiet --cached"
1554 __gitcomp
"$subcommands"
1564 init fetch clone rebase dcommit log find-rev
1565 set-tree commit-diff info create-ignore propget
1566 proplist show-ignore show-externals
1568 local subcommand
="$(__git_find_subcommand "$subcommands")"
1569 if [ -z "$subcommand" ]; then
1570 __gitcomp
"$subcommands"
1572 local remote_opts
="--username= --config-dir= --no-auth-cache"
1574 --follow-parent --authors-file= --repack=
1575 --no-metadata --use-svm-props --use-svnsync-props
1576 --log-window-size= --no-checkout --quiet
1577 --repack-flags --user-log-author $remote_opts
1580 --template= --shared= --trunk= --tags=
1581 --branches= --stdlayout --minimize-url
1582 --no-metadata --use-svm-props --use-svnsync-props
1583 --rewrite-root= $remote_opts
1586 --edit --rmdir --find-copies-harder --copy-similarity=
1589 local cur
="${COMP_WORDS[COMP_CWORD]}"
1590 case "$subcommand,$cur" in
1592 __gitcomp
"--revision= --fetch-all $fc_opts"
1595 __gitcomp
"--revision= $fc_opts $init_opts"
1598 __gitcomp
"$init_opts"
1602 --merge --strategy= --verbose --dry-run
1603 --fetch-all --no-rebase $cmt_opts $fc_opts
1607 __gitcomp
"--stdin $cmt_opts $fc_opts"
1609 create-ignore
,--*|propget
,--*|proplist
,--*|show-ignore
,--*|\
1611 __gitcomp
"--revision="
1615 --limit= --revision= --verbose --incremental
1616 --oneline --show-commit --non-recursive
1622 --merge --verbose --strategy= --local
1623 --fetch-all $fc_opts
1627 __gitcomp
"--message= --file= --revision= $cmt_opts"
1642 while [ $c -lt $COMP_CWORD ]; do
1643 i
="${COMP_WORDS[c]}"
1646 __gitcomp
"$(__git_tags)"
1656 case "${COMP_WORDS[COMP_CWORD-1]}" in
1662 __gitcomp
"$(__git_tags)"
1668 __gitcomp
"$(__git_refs)"
1675 local i c
=1 command __git_dir
1677 while [ $c -lt $COMP_CWORD ]; do
1678 i
="${COMP_WORDS[c]}"
1680 --git-dir=*) __git_dir
="${i#--git-dir=}" ;;
1681 --bare) __git_dir
="." ;;
1682 --version|
-p|
--paginate) ;;
1683 --help) command="help"; break ;;
1684 *) command="$i"; break ;;
1689 if [ -z "$command" ]; then
1690 case "${COMP_WORDS[COMP_CWORD]}" in
1702 *) __gitcomp
"$(__git_porcelain_commands) $(__git_aliases)" ;;
1707 local expansion
=$
(__git_aliased_command
"$command")
1708 [ "$expansion" ] && command="$expansion"
1713 apply
) _git_apply
;;
1714 archive
) _git_archive
;;
1715 bisect
) _git_bisect
;;
1716 bundle
) _git_bundle
;;
1717 branch
) _git_branch
;;
1718 checkout
) _git_checkout
;;
1719 cherry
) _git_cherry
;;
1720 cherry-pick
) _git_cherry_pick
;;
1721 clean
) _git_clean
;;
1722 clone
) _git_clone
;;
1723 commit
) _git_commit
;;
1724 config
) _git_config
;;
1725 describe
) _git_describe
;;
1727 fetch
) _git_fetch
;;
1728 format-patch
) _git_format_patch
;;
1734 ls-files
) _git_ls_files
;;
1735 ls-remote
) _git_ls_remote
;;
1736 ls-tree
) _git_ls_tree
;;
1738 mergetool
) _git_mergetool
;;
1739 merge-base
) _git_merge_base
;;
1741 name-rev
) _git_name_rev
;;
1744 rebase
) _git_rebase
;;
1745 remote
) _git_remote
;;
1746 reset) _git_reset
;;
1747 revert
) _git_revert
;;
1749 send-email
) _git_send_email
;;
1750 shortlog
) _git_shortlog
;;
1752 show-branch
) _git_show_branch
;;
1753 stash
) _git_stash
;;
1755 submodule
) _git_submodule
;;
1758 whatchanged
) _git_log
;;
1765 __git_has_doubledash
&& return
1767 local cur
="${COMP_WORDS[COMP_CWORD]}"
1768 local g
="$(git rev-parse --git-dir 2>/dev/null)"
1770 if [ -f $g/MERGE_HEAD
]; then
1775 __gitcomp
"--not --all $merge"
1779 __git_complete_revlist
1782 complete
-o bashdefault
-o default
-o nospace
-F _git git
2>/dev
/null \
1783 || complete
-o default
-o nospace
-F _git git
1784 complete
-o bashdefault
-o default
-o nospace
-F _gitk gitk
2>/dev
/null \
1785 || complete
-o default
-o nospace
-F _gitk gitk
1787 # The following are necessary only for Cygwin, and only are needed
1788 # when the user has tab-completed the executable name and consequently
1789 # included the '.exe' suffix.
1791 if [ Cygwin
= "$(uname -o 2>/dev/null)" ]; then
1792 complete
-o bashdefault
-o default
-o nospace
-F _git git.exe
2>/dev
/null \
1793 || complete
-o default
-o nospace
-F _git git.exe