2 # bash completion support for core Git.
4 # Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
5 # Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
6 # Distributed under the GNU General Public License, version 2.0.
8 # The contained completion routines provide support for completing:
10 # *) local and remote branch names
11 # *) local and remote tag names
12 # *) .git/remotes file names
13 # *) git 'subcommands'
14 # *) tree paths within 'ref:path/to/file' expressions
15 # *) common --long-options
17 # To use these routines:
19 # 1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
20 # 2) Added the following line to your .bashrc:
21 # source ~/.git-completion.sh
23 # 3) You may want to make sure the git executable is available
24 # in your PATH before this script is sourced, as some caching
25 # is performed while the script loads. If git isn't found
26 # at source time then all lookups will be done on demand,
27 # which may be slightly slower.
29 # 4) Consider changing your PS1 to also show the current branch:
30 # PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
32 # The argument to __git_ps1 will be displayed only if you
33 # are currently in a git repository. The %s token will be
34 # the name of the current branch.
38 # *) Read Documentation/SubmittingPatches
39 # *) Send all patches to the current maintainer:
41 # "Shawn O. Pearce" <spearce@spearce.org>
43 # *) Always CC the Git mailing list:
48 case "$COMP_WORDBREAKS" in
50 *) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
56 if [ -n "$__git_dir" ]; then
58 elif [ -d .git ]; then
61 git rev-parse --git-dir 2>/dev/null
63 elif [ -d "$1/.git" ]; then
72 local g="$(git rev-parse --git-dir 2>/dev/null)"
76 if [ -d "$g/rebase-apply" ]
78 if test -f "$g/rebase-apply/rebasing"
81 elif test -f "$g/rebase-apply/applying"
87 b="$(git symbolic-ref HEAD 2>/dev/null)"
88 elif [ -f "$g/rebase-merge/interactive" ]
91 b="$(cat "$g/rebase-merge/head-name")"
92 elif [ -d "$g/rebase-merge" ]
95 b="$(cat "$g/rebase-merge/head-name")"
96 elif [ -f "$g/MERGE_HEAD" ]
99 b="$(git symbolic-ref HEAD 2>/dev/null)"
101 if [ -f "$g/BISECT_LOG" ]
105 if ! b="$(git symbolic-ref HEAD 2>/dev/null)"
107 if ! b="$(git describe --exact-match HEAD 2>/dev/null)"
109 b="$(cut -c1-7 "$g/HEAD")..."
115 printf "$1" "${b##refs/heads/}$r"
117 printf " (%s)" "${b##refs/heads/}$r"
124 local c IFS=' '$'\t'$'\n'
127 --*=*) printf %s$'\n' "$c$2" ;;
128 *.) printf %s$'\n' "$c$2" ;;
129 *) printf %s$'\n' "$c$2 " ;;
136 local cur="${COMP_WORDS[COMP_CWORD]}"
137 if [ $# -gt 2 ]; then
146 COMPREPLY=($(compgen -P "$2" \
147 -W "$(__gitcomp_1 "$1" "$4")" \
155 local cmd i is_hash=y dir="$(__gitdir "$1")"
156 if [ -d "$dir" ]; then
157 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
161 for i in $(git ls-remote "$1" 2>/dev/null); do
162 case "$is_hash,$i" in
165 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
166 n,*) is_hash=y; echo "$i" ;;
173 local cmd i is_hash=y dir="$(__gitdir "$1")"
174 if [ -d "$dir" ]; then
175 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
179 for i in $(git ls-remote "$1" 2>/dev/null); do
180 case "$is_hash,$i" in
183 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
184 n,*) is_hash=y; echo "$i" ;;
191 local i is_hash=y dir="$(__gitdir "$1")"
192 local cur="${COMP_WORDS[COMP_CWORD]}" format refs
193 if [ -d "$dir" ]; then
200 if [ -e "$dir/HEAD" ]; then echo HEAD; fi
201 format="refname:short"
202 refs="refs/tags refs/heads refs/remotes"
205 git --git-dir="$dir" for-each-ref --format="%($format)" \
209 for i in $(git ls-remote "$dir" 2>/dev/null); do
210 case "$is_hash,$i" in
213 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
214 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
215 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
216 n,*) is_hash=y; echo "$i" ;;
224 for i in $(__git_refs "$1"); do
229 __git_refs_remotes ()
231 local cmd i is_hash=y
232 for i in $(git ls-remote "$1" 2>/dev/null); do
233 case "$is_hash,$i" in
236 echo "$i:refs/remotes/$1/${i#refs/heads/}"
240 n,refs/tags/*) is_hash=y;;
248 local i ngoff IFS=$'\n' d="$(__gitdir)"
249 shopt -q nullglob || ngoff=1
251 for i in "$d/remotes"/*; do
252 echo ${i#$d/remotes/}
254 [ "$ngoff" ] && shopt -u nullglob
255 for i in $(git --git-dir="$d" config --list); do
265 __git_merge_strategies ()
267 if [ -n "$__git_merge_strategylist" ]; then
268 echo "$__git_merge_strategylist"
271 git merge -s help 2>&1 |
272 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
280 __git_merge_strategylist=
281 __git_merge_strategylist=$(__git_merge_strategies 2>/dev/null)
283 __git_complete_file ()
285 local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
302 case "$COMP_WORDBREAKS" in
304 *) pfx="$ref:$pfx" ;;
308 COMPREPLY=($(compgen -P "$pfx" \
309 -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
310 | sed '/^100... blob /{
326 __gitcomp "$(__git_refs)"
331 __git_complete_revlist ()
333 local pfx cur="${COMP_WORDS[COMP_CWORD]}"
338 __gitcomp "$(__git_refs)" "$pfx" "$cur"
343 __gitcomp "$(__git_refs)" "$pfx" "$cur"
346 __gitcomp "$(__git_refs)"
351 __git_all_commands ()
353 if [ -n "$__git_all_commandlist" ]; then
354 echo "$__git_all_commandlist"
358 for i in $(git help -a|egrep '^ ')
361 *--*) : helper pattern;;
366 __git_all_commandlist=
367 __git_all_commandlist="$(__git_all_commands 2>/dev/null)"
369 __git_porcelain_commands ()
371 if [ -n "$__git_porcelain_commandlist" ]; then
372 echo "$__git_porcelain_commandlist"
376 for i in "help" $(__git_all_commands)
379 *--*) : helper pattern;;
380 applymbox) : ask gittus;;
381 applypatch) : ask gittus;;
382 archimport) : import;;
383 cat-file) : plumbing;;
384 check-attr) : plumbing;;
385 check-ref-format) : plumbing;;
386 checkout-index) : plumbing;;
387 commit-tree) : plumbing;;
388 count-objects) : infrequent;;
389 cvsexportcommit) : export;;
390 cvsimport) : import;;
391 cvsserver) : daemon;;
393 diff-files) : plumbing;;
394 diff-index) : plumbing;;
395 diff-tree) : plumbing;;
396 fast-import) : import;;
397 fast-export) : export;;
398 fsck-objects) : plumbing;;
399 fetch-pack) : plumbing;;
400 fmt-merge-msg) : plumbing;;
401 for-each-ref) : plumbing;;
402 hash-object) : plumbing;;
403 http-*) : transport;;
404 index-pack) : plumbing;;
405 init-db) : deprecated;;
406 local-fetch) : plumbing;;
407 lost-found) : infrequent;;
408 ls-files) : plumbing;;
409 ls-remote) : plumbing;;
410 ls-tree) : plumbing;;
411 mailinfo) : plumbing;;
412 mailsplit) : plumbing;;
413 merge-*) : plumbing;;
416 pack-objects) : plumbing;;
417 pack-redundant) : plumbing;;
418 pack-refs) : plumbing;;
419 parse-remote) : plumbing;;
420 patch-id) : plumbing;;
421 peek-remote) : plumbing;;
423 prune-packed) : plumbing;;
424 quiltimport) : import;;
425 read-tree) : plumbing;;
426 receive-pack) : plumbing;;
428 repo-config) : deprecated;;
430 rev-list) : plumbing;;
431 rev-parse) : plumbing;;
432 runstatus) : plumbing;;
433 sh-setup) : internal;;
435 show-ref) : plumbing;;
436 send-pack) : plumbing;;
437 show-index) : plumbing;;
439 stripspace) : plumbing;;
440 symbolic-ref) : plumbing;;
441 tar-tree) : deprecated;;
442 unpack-file) : plumbing;;
443 unpack-objects) : plumbing;;
444 update-index) : plumbing;;
445 update-ref) : plumbing;;
446 update-server-info) : daemon;;
447 upload-archive) : plumbing;;
448 upload-pack) : plumbing;;
449 write-tree) : plumbing;;
451 verify-pack) : infrequent;;
452 verify-tag) : plumbing;;
457 __git_porcelain_commandlist=
458 __git_porcelain_commandlist="$(__git_porcelain_commands 2>/dev/null)"
463 for i in $(git --git-dir="$(__gitdir)" config --list); do
473 __git_aliased_command ()
475 local word cmdline=$(git --git-dir="$(__gitdir)" \
476 config --get "alias.$1")
477 for word in $cmdline; do
478 if [ "${word##-*}" ]; then
485 __git_find_subcommand ()
487 local word subcommand c=1
489 while [ $c -lt $COMP_CWORD ]; do
490 word="${COMP_WORDS[c]}"
491 for subcommand in $1; do
492 if [ "$subcommand" = "$word" ]; then
501 __git_has_doubledash ()
504 while [ $c -lt $COMP_CWORD ]; do
505 if [ "--" = "${COMP_WORDS[c]}" ]; then
513 __git_whitespacelist="nowarn warn error error-all fix"
517 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
518 if [ -d "$dir"/rebase-apply ]; then
519 __gitcomp "--skip --resolved --abort"
524 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
529 --signoff --utf8 --binary --3way --interactive
539 local cur="${COMP_WORDS[COMP_CWORD]}"
542 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
547 --stat --numstat --summary --check --index
548 --cached --index-info --reverse --reject --unidiff-zero
549 --apply --no-add --exclude=
550 --whitespace= --inaccurate-eof --verbose
559 __git_has_doubledash && return
561 local cur="${COMP_WORDS[COMP_CWORD]}"
565 --interactive --refresh --patch --update --dry-run
566 --ignore-errors --intent-to-add
575 local cur="${COMP_WORDS[COMP_CWORD]}"
578 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
582 __gitcomp "$(__git_remotes)" "" "${cur##--remote=}"
587 --format= --list --verbose
588 --prefix= --remote= --exec=
598 __git_has_doubledash && return
600 local subcommands="start bad good skip reset visualize replay log run"
601 local subcommand="$(__git_find_subcommand "$subcommands")"
602 if [ -z "$subcommand" ]; then
603 __gitcomp "$subcommands"
607 case "$subcommand" in
609 __gitcomp "$(__git_refs)"
619 local i c=1 only_local_ref="n" has_r="n"
621 while [ $c -lt $COMP_CWORD ]; do
624 -d|-m) only_local_ref="y" ;;
630 case "${COMP_WORDS[COMP_CWORD]}" in
631 --*=*) COMPREPLY=() ;;
634 --color --no-color --verbose --abbrev= --no-abbrev
635 --track --no-track --contains --merged --no-merged
639 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
640 __gitcomp "$(__git_heads)"
642 __gitcomp "$(__git_refs)"
650 local cmd="${COMP_WORDS[2]}"
651 case "$COMP_CWORD" in
653 __gitcomp "create list-heads verify unbundle"
661 __git_complete_revlist
670 __git_has_doubledash && return
672 __gitcomp "$(__git_refs)"
677 __gitcomp "$(__git_refs)"
682 local cur="${COMP_WORDS[COMP_CWORD]}"
685 __gitcomp "--edit --no-commit"
688 __gitcomp "$(__git_refs)"
695 __git_has_doubledash && return
697 local cur="${COMP_WORDS[COMP_CWORD]}"
700 __gitcomp "--dry-run --quiet"
709 local cur="${COMP_WORDS[COMP_CWORD]}"
734 __git_has_doubledash && return
736 local cur="${COMP_WORDS[COMP_CWORD]}"
740 --all --author= --signoff --verify --no-verify
741 --edit --amend --include --only --interactive
750 local cur="${COMP_WORDS[COMP_CWORD]}"
754 --all --tags --contains --abbrev= --candidates=
755 --exact-match --debug --long --match --always
759 __gitcomp "$(__git_refs)"
764 __git_has_doubledash && return
766 local cur="${COMP_WORDS[COMP_CWORD]}"
769 __gitcomp "--cached --stat --numstat --shortstat --summary
770 --patch-with-stat --name-only --name-status --color
771 --no-color --color-words --no-renames --check
772 --full-index --binary --abbrev --diff-filter=
773 --find-copies-harder --pickaxe-all --pickaxe-regex
774 --text --ignore-space-at-eol --ignore-space-change
775 --ignore-all-space --exit-code --quiet --ext-diff
777 --no-prefix --src-prefix= --dst-prefix=
778 --base --ours --theirs
779 --inter-hunk-context=
789 local cur="${COMP_WORDS[COMP_CWORD]}"
791 if [ "$COMP_CWORD" = 2 ]; then
792 __gitcomp "$(__git_remotes)"
797 case "$COMP_WORDBREAKS" in
799 *) pfx="${cur%%:*}:" ;;
801 __gitcomp "$(__git_refs)" "$pfx" "${cur#*:}"
804 __gitcomp "$(__git_refs2 "${COMP_WORDS[2]}")"
812 local cur="${COMP_WORDS[COMP_CWORD]}"
816 --stdout --attach --thread
818 --numbered --start-number
823 --full-index --binary
826 --no-prefix --src-prefix= --dst-prefix=
831 __git_complete_revlist
836 local cur="${COMP_WORDS[COMP_CWORD]}"
839 __gitcomp "--prune --aggressive"
848 __git_has_doubledash && return
850 local cur="${COMP_WORDS[COMP_CWORD]}"
855 --text --ignore-case --word-regexp --invert-match
857 --extended-regexp --basic-regexp --fixed-strings
858 --files-with-matches --name-only
859 --files-without-match
861 --and --or --not --all-match
871 local cur="${COMP_WORDS[COMP_CWORD]}"
874 __gitcomp "--all --info --man --web"
878 __gitcomp "$(__git_all_commands)
879 attributes cli core-tutorial cvs-migration
880 diffcore gitk glossary hooks ignore modules
881 repository-layout tutorial tutorial-2
888 local cur="${COMP_WORDS[COMP_CWORD]}"
892 false true umask group all world everybody
893 " "" "${cur##--shared=}"
897 __gitcomp "--quiet --bare --template= --shared --shared="
906 __git_has_doubledash && return
908 local cur="${COMP_WORDS[COMP_CWORD]}"
911 __gitcomp "--cached --deleted --modified --others --ignored
912 --stage --directory --no-empty-directory --unmerged
913 --killed --exclude= --exclude-from=
914 --exclude-per-directory= --exclude-standard
915 --error-unmatch --with-tree= --full-name
916 --abbrev --ignored --exclude-per-directory
926 __gitcomp "$(__git_remotes)"
936 __git_has_doubledash && return
938 local cur="${COMP_WORDS[COMP_CWORD]}"
942 oneline short medium full fuller email raw
943 " "" "${cur##--pretty=}"
948 relative iso8601 rfc2822 short local default
949 " "" "${cur##--date=}"
954 --max-count= --max-age= --since= --after=
955 --min-age= --before= --until=
956 --root --topo-order --date-order --reverse
958 --abbrev-commit --abbrev=
959 --relative-date --date=
960 --author= --committer= --grep=
962 --pretty= --name-status --name-only --raw
964 --left-right --cherry-pick
966 --stat --numstat --shortstat
967 --decorate --diff-filter=
968 --color-words --walk-reflogs
969 --parents --children --full-history
971 --inter-hunk-context=
976 __git_complete_revlist
981 local cur="${COMP_WORDS[COMP_CWORD]}"
982 case "${COMP_WORDS[COMP_CWORD-1]}" in
984 __gitcomp "$(__git_merge_strategies)"
989 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
994 --no-commit --no-stat --log --no-log --squash --strategy
998 __gitcomp "$(__git_refs)"
1003 local cur="${COMP_WORDS[COMP_CWORD]}"
1007 kdiff3 tkdiff meld xxdiff emerge
1008 vimdiff gvimdiff ecmerge opendiff
1009 " "" "${cur##--tool=}"
1022 __gitcomp "$(__git_refs)"
1027 local cur="${COMP_WORDS[COMP_CWORD]}"
1030 __gitcomp "--dry-run"
1039 __gitcomp "--tags --all --stdin"
1044 local cur="${COMP_WORDS[COMP_CWORD]}"
1046 if [ "$COMP_CWORD" = 2 ]; then
1047 __gitcomp "$(__git_remotes)"
1049 __gitcomp "$(__git_refs "${COMP_WORDS[2]}")"
1055 local cur="${COMP_WORDS[COMP_CWORD]}"
1057 if [ "$COMP_CWORD" = 2 ]; then
1058 __gitcomp "$(__git_remotes)"
1063 case "$COMP_WORDBREAKS" in
1065 *) pfx="${cur%%:*}:" ;;
1068 __gitcomp "$(__git_refs "${COMP_WORDS[2]}")" "$pfx" "${cur#*:}"
1071 __gitcomp "$(__git_refs)" + "${cur#+}"
1074 __gitcomp "$(__git_refs)"
1082 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
1083 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1084 __gitcomp "--continue --skip --abort"
1087 case "${COMP_WORDS[COMP_CWORD-1]}" in
1089 __gitcomp "$(__git_merge_strategies)"
1094 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
1098 __gitcomp "--onto --merge --strategy --interactive"
1101 __gitcomp "$(__git_refs)"
1106 local cur="${COMP_WORDS[COMP_CWORD]}"
1109 __gitcomp "--bcc --cc --cc-cmd --chain-reply-to --compose
1110 --dry-run --envelope-sender --from --identity
1111 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1112 --no-suppress-from --no-thread --quiet
1113 --signed-off-by-cc --smtp-pass --smtp-server
1114 --smtp-server-port --smtp-ssl --smtp-user --subject
1115 --suppress-cc --suppress-from --thread --to
1116 --validate --no-validate"
1125 local cur="${COMP_WORDS[COMP_CWORD]}"
1126 local prv="${COMP_WORDS[COMP_CWORD-1]}"
1129 __gitcomp "$(__git_remotes)"
1133 __gitcomp "$(__git_refs)"
1137 local remote="${prv#remote.}"
1138 remote="${remote%.fetch}"
1139 __gitcomp "$(__git_refs_remotes "$remote")"
1143 local remote="${prv#remote.}"
1144 remote="${remote%.push}"
1145 __gitcomp "$(git --git-dir="$(__gitdir)" \
1146 for-each-ref --format='%(refname):%(refname)' \
1150 pull.twohead|pull.octopus)
1151 __gitcomp "$(__git_merge_strategies)"
1154 color.branch|color.diff|color.status)
1155 __gitcomp "always never auto"
1160 normal black red green yellow blue magenta cyan white
1161 bold dim ul blink reverse
1173 --global --system --file=
1174 --list --replace-all
1175 --get --get-all --get-regexp
1176 --add --unset --unset-all
1177 --remove-section --rename-section
1182 local pfx="${cur%.*}."
1184 __gitcomp "remote merge mergeoptions" "$pfx" "$cur"
1188 local pfx="${cur%.*}."
1190 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1194 local pfx="${cur%.*}."
1197 url proxy fetch push mirror skipDefaultUpdate
1198 receivepack uploadpack tagopt
1203 local pfx="${cur%.*}."
1205 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1211 branch.autosetupmerge
1212 branch.autosetuprebase
1215 color.branch.current
1226 color.diff.whitespace
1228 color.interactive.header
1229 color.interactive.help
1230 color.interactive.prompt
1234 color.status.changed
1236 color.status.nobranch
1237 color.status.untracked
1238 color.status.updated
1244 core.deltaBaseCacheLimit
1248 core.fsyncobjectfiles
1250 core.ignoreCygwinFSTricks
1252 core.logAllRefUpdates
1253 core.loosecompression
1255 core.packedGitWindowSize
1257 core.preferSymlinkRefs
1260 core.repositoryFormatVersion
1262 core.sharedRepository
1265 core.warnAmbiguousRefs
1268 diff.autorefreshindex
1285 gc.reflogexpireunreachable
1289 gitcvs.dbTableNamePrefix
1299 gui.copyblamethreshold
1303 gui.matchtrackingbranch
1304 gui.newbranchtemplate
1305 gui.pruneduringfetch
1306 gui.spellingdictionary
1322 i18n.logOutputEncoding
1337 mergetool.keepBackup
1339 pack.deltaCacheLimit
1349 receive.denyCurrentBranch
1351 receive.denyNonFastForwards
1354 repack.usedeltabaseoffset
1358 status.relativePaths
1359 status.showUntrackedFiles
1361 transfer.unpackLimit
1372 local subcommands="add rm show prune update"
1373 local subcommand="$(__git_find_subcommand "$subcommands")"
1374 if [ -z "$subcommand" ]; then
1375 __gitcomp "$subcommands"
1379 case "$subcommand" in
1381 __gitcomp "$(__git_remotes)"
1384 local i c='' IFS=$'\n'
1385 for i in $(git --git-dir="$(__gitdir)" config --list); do
1403 __git_has_doubledash && return
1405 local cur="${COMP_WORDS[COMP_CWORD]}"
1408 __gitcomp "--merge --mixed --hard --soft"
1412 __gitcomp "$(__git_refs)"
1417 local cur="${COMP_WORDS[COMP_CWORD]}"
1420 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
1424 __gitcomp "$(__git_refs)"
1429 __git_has_doubledash && return
1431 local cur="${COMP_WORDS[COMP_CWORD]}"
1434 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1443 __git_has_doubledash && return
1445 local cur="${COMP_WORDS[COMP_CWORD]}"
1449 --max-count= --max-age= --since= --after=
1450 --min-age= --before= --until=
1452 --author= --committer= --grep=
1455 --numbered --summary
1460 __git_complete_revlist
1465 __git_has_doubledash && return
1467 local cur="${COMP_WORDS[COMP_CWORD]}"
1471 oneline short medium full fuller email raw
1472 " "" "${cur##--pretty=}"
1476 __gitcomp "--pretty="
1485 local cur="${COMP_WORDS[COMP_CWORD]}"
1489 --all --remotes --topo-order --current --more=
1490 --list --independent --merge-base --no-name
1491 --sha1-name --topics --reflog
1496 __git_complete_revlist
1501 local subcommands='save list show apply clear drop pop create branch'
1502 local subcommand="$(__git_find_subcommand "$subcommands")"
1503 if [ -z "$subcommand" ]; then
1504 __gitcomp "$subcommands"
1506 local cur="${COMP_WORDS[COMP_CWORD]}"
1507 case "$subcommand,$cur" in
1509 __gitcomp "--keep-index"
1514 show,--*|drop,--*|pop,--*|branch,--*)
1517 show,*|apply,*|drop,*|pop,*|branch,*)
1518 __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
1519 | sed -n -e 's/:.*//p')"
1530 __git_has_doubledash && return
1532 local subcommands="add status init update summary foreach sync"
1533 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1534 local cur="${COMP_WORDS[COMP_CWORD]}"
1537 __gitcomp "--quiet --cached"
1540 __gitcomp "$subcommands"
1550 init fetch clone rebase dcommit log find-rev
1551 set-tree commit-diff info create-ignore propget
1552 proplist show-ignore show-externals
1554 local subcommand="$(__git_find_subcommand "$subcommands")"
1555 if [ -z "$subcommand" ]; then
1556 __gitcomp "$subcommands"
1558 local remote_opts="--username= --config-dir= --no-auth-cache"
1560 --follow-parent --authors-file= --repack=
1561 --no-metadata --use-svm-props --use-svnsync-props
1562 --log-window-size= --no-checkout --quiet
1563 --repack-flags --user-log-author $remote_opts
1566 --template= --shared= --trunk= --tags=
1567 --branches= --stdlayout --minimize-url
1568 --no-metadata --use-svm-props --use-svnsync-props
1569 --rewrite-root= $remote_opts
1572 --edit --rmdir --find-copies-harder --copy-similarity=
1575 local cur="${COMP_WORDS[COMP_CWORD]}"
1576 case "$subcommand,$cur" in
1578 __gitcomp "--revision= --fetch-all $fc_opts"
1581 __gitcomp "--revision= $fc_opts $init_opts"
1584 __gitcomp "$init_opts"
1588 --merge --strategy= --verbose --dry-run
1589 --fetch-all --no-rebase $cmt_opts $fc_opts
1593 __gitcomp "--stdin $cmt_opts $fc_opts"
1595 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1597 __gitcomp "--revision="
1601 --limit= --revision= --verbose --incremental
1602 --oneline --show-commit --non-recursive
1608 --merge --verbose --strategy= --local
1609 --fetch-all $fc_opts
1613 __gitcomp "--message= --file= --revision= $cmt_opts"
1628 while [ $c -lt $COMP_CWORD ]; do
1629 i="${COMP_WORDS[c]}"
1632 __gitcomp "$(__git_tags)"
1642 case "${COMP_WORDS[COMP_CWORD-1]}" in
1648 __gitcomp "$(__git_tags)"
1654 __gitcomp "$(__git_refs)"
1661 local i c=1 command __git_dir
1663 while [ $c -lt $COMP_CWORD ]; do
1664 i="${COMP_WORDS[c]}"
1666 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1667 --bare) __git_dir="." ;;
1668 --version|-p|--paginate) ;;
1669 --help) command="help"; break ;;
1670 *) command="$i"; break ;;
1675 if [ -z "$command" ]; then
1676 case "${COMP_WORDS[COMP_CWORD]}" in
1677 --*=*) COMPREPLY=() ;;
1689 *) __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
1694 local expansion=$(__git_aliased_command "$command")
1695 [ "$expansion" ] && command="$expansion"
1700 apply) _git_apply ;;
1701 archive) _git_archive ;;
1702 bisect) _git_bisect ;;
1703 bundle) _git_bundle ;;
1704 branch) _git_branch ;;
1705 checkout) _git_checkout ;;
1706 cherry) _git_cherry ;;
1707 cherry-pick) _git_cherry_pick ;;
1708 clean) _git_clean ;;
1709 clone) _git_clone ;;
1710 commit) _git_commit ;;
1711 config) _git_config ;;
1712 describe) _git_describe ;;
1714 fetch) _git_fetch ;;
1715 format-patch) _git_format_patch ;;
1721 ls-files) _git_ls_files ;;
1722 ls-remote) _git_ls_remote ;;
1723 ls-tree) _git_ls_tree ;;
1725 mergetool) _git_mergetool;;
1726 merge-base) _git_merge_base ;;
1728 name-rev) _git_name_rev ;;
1731 rebase) _git_rebase ;;
1732 remote) _git_remote ;;
1733 reset) _git_reset ;;
1734 revert) _git_revert ;;
1736 send-email) _git_send_email ;;
1737 shortlog) _git_shortlog ;;
1739 show-branch) _git_show_branch ;;
1740 stash) _git_stash ;;
1742 submodule) _git_submodule ;;
1745 whatchanged) _git_log ;;
1752 __git_has_doubledash && return
1754 local cur="${COMP_WORDS[COMP_CWORD]}"
1755 local g="$(git rev-parse --git-dir 2>/dev/null)"
1757 if [ -f $g/MERGE_HEAD ]; then
1762 __gitcomp "--not --all $merge"
1766 __git_complete_revlist
1769 complete -o default -o nospace -F _git git
1770 complete -o default -o nospace -F _gitk gitk
1772 # The following are necessary only for Cygwin, and only are needed
1773 # when the user has tab-completed the executable name and consequently
1774 # included the '.exe' suffix.
1776 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1777 complete -o default -o nospace -F _git git.exe