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
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
788 local cur="${COMP_WORDS[COMP_CWORD]}"
790 if [ "$COMP_CWORD" = 2 ]; then
791 __gitcomp "$(__git_remotes)"
796 case "$COMP_WORDBREAKS" in
798 *) pfx="${cur%%:*}:" ;;
800 __gitcomp "$(__git_refs)" "$pfx" "${cur#*:}"
803 __gitcomp "$(__git_refs2 "${COMP_WORDS[2]}")"
811 local cur="${COMP_WORDS[COMP_CWORD]}"
815 --stdout --attach --thread
817 --numbered --start-number
822 --full-index --binary
825 --no-prefix --src-prefix= --dst-prefix=
830 __git_complete_revlist
835 local cur="${COMP_WORDS[COMP_CWORD]}"
838 __gitcomp "--prune --aggressive"
847 __git_has_doubledash && return
849 local cur="${COMP_WORDS[COMP_CWORD]}"
854 --text --ignore-case --word-regexp --invert-match
856 --extended-regexp --basic-regexp --fixed-strings
857 --files-with-matches --name-only
858 --files-without-match
860 --and --or --not --all-match
870 local cur="${COMP_WORDS[COMP_CWORD]}"
873 __gitcomp "--all --info --man --web"
877 __gitcomp "$(__git_all_commands)
878 attributes cli core-tutorial cvs-migration
879 diffcore gitk glossary hooks ignore modules
880 repository-layout tutorial tutorial-2
887 local cur="${COMP_WORDS[COMP_CWORD]}"
891 false true umask group all world everybody
892 " "" "${cur##--shared=}"
896 __gitcomp "--quiet --bare --template= --shared --shared="
905 __git_has_doubledash && return
907 local cur="${COMP_WORDS[COMP_CWORD]}"
910 __gitcomp "--cached --deleted --modified --others --ignored
911 --stage --directory --no-empty-directory --unmerged
912 --killed --exclude= --exclude-from=
913 --exclude-per-directory= --exclude-standard
914 --error-unmatch --with-tree= --full-name
915 --abbrev --ignored --exclude-per-directory
925 __gitcomp "$(__git_remotes)"
935 __git_has_doubledash && return
937 local cur="${COMP_WORDS[COMP_CWORD]}"
941 oneline short medium full fuller email raw
942 " "" "${cur##--pretty=}"
947 relative iso8601 rfc2822 short local default
948 " "" "${cur##--date=}"
953 --max-count= --max-age= --since= --after=
954 --min-age= --before= --until=
955 --root --topo-order --date-order --reverse
957 --abbrev-commit --abbrev=
958 --relative-date --date=
959 --author= --committer= --grep=
961 --pretty= --name-status --name-only --raw
963 --left-right --cherry-pick
965 --stat --numstat --shortstat
966 --decorate --diff-filter=
967 --color-words --walk-reflogs
968 --parents --children --full-history
974 __git_complete_revlist
979 local cur="${COMP_WORDS[COMP_CWORD]}"
980 case "${COMP_WORDS[COMP_CWORD-1]}" in
982 __gitcomp "$(__git_merge_strategies)"
987 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
992 --no-commit --no-stat --log --no-log --squash --strategy
996 __gitcomp "$(__git_refs)"
1001 local cur="${COMP_WORDS[COMP_CWORD]}"
1005 kdiff3 tkdiff meld xxdiff emerge
1006 vimdiff gvimdiff ecmerge opendiff
1007 " "" "${cur##--tool=}"
1020 __gitcomp "$(__git_refs)"
1025 local cur="${COMP_WORDS[COMP_CWORD]}"
1028 __gitcomp "--dry-run"
1037 __gitcomp "--tags --all --stdin"
1042 local cur="${COMP_WORDS[COMP_CWORD]}"
1044 if [ "$COMP_CWORD" = 2 ]; then
1045 __gitcomp "$(__git_remotes)"
1047 __gitcomp "$(__git_refs "${COMP_WORDS[2]}")"
1053 local cur="${COMP_WORDS[COMP_CWORD]}"
1055 if [ "$COMP_CWORD" = 2 ]; then
1056 __gitcomp "$(__git_remotes)"
1061 case "$COMP_WORDBREAKS" in
1063 *) pfx="${cur%%:*}:" ;;
1066 __gitcomp "$(__git_refs "${COMP_WORDS[2]}")" "$pfx" "${cur#*:}"
1069 __gitcomp "$(__git_refs)" + "${cur#+}"
1072 __gitcomp "$(__git_refs)"
1080 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
1081 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1082 __gitcomp "--continue --skip --abort"
1085 case "${COMP_WORDS[COMP_CWORD-1]}" in
1087 __gitcomp "$(__git_merge_strategies)"
1092 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
1096 __gitcomp "--onto --merge --strategy --interactive"
1099 __gitcomp "$(__git_refs)"
1104 local cur="${COMP_WORDS[COMP_CWORD]}"
1107 __gitcomp "--bcc --cc --cc-cmd --chain-reply-to --compose
1108 --dry-run --envelope-sender --from --identity
1109 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1110 --no-suppress-from --no-thread --quiet
1111 --signed-off-by-cc --smtp-pass --smtp-server
1112 --smtp-server-port --smtp-ssl --smtp-user --subject
1113 --suppress-cc --suppress-from --thread --to
1114 --validate --no-validate"
1123 local cur="${COMP_WORDS[COMP_CWORD]}"
1124 local prv="${COMP_WORDS[COMP_CWORD-1]}"
1127 __gitcomp "$(__git_remotes)"
1131 __gitcomp "$(__git_refs)"
1135 local remote="${prv#remote.}"
1136 remote="${remote%.fetch}"
1137 __gitcomp "$(__git_refs_remotes "$remote")"
1141 local remote="${prv#remote.}"
1142 remote="${remote%.push}"
1143 __gitcomp "$(git --git-dir="$(__gitdir)" \
1144 for-each-ref --format='%(refname):%(refname)' \
1148 pull.twohead|pull.octopus)
1149 __gitcomp "$(__git_merge_strategies)"
1152 color.branch|color.diff|color.status)
1153 __gitcomp "always never auto"
1158 normal black red green yellow blue magenta cyan white
1159 bold dim ul blink reverse
1171 --global --system --file=
1172 --list --replace-all
1173 --get --get-all --get-regexp
1174 --add --unset --unset-all
1175 --remove-section --rename-section
1180 local pfx="${cur%.*}."
1182 __gitcomp "remote merge mergeoptions" "$pfx" "$cur"
1186 local pfx="${cur%.*}."
1188 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1192 local pfx="${cur%.*}."
1195 url proxy fetch push mirror skipDefaultUpdate
1196 receivepack uploadpack tagopt
1201 local pfx="${cur%.*}."
1203 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1209 branch.autosetupmerge
1210 branch.autosetuprebase
1213 color.branch.current
1224 color.diff.whitespace
1226 color.interactive.header
1227 color.interactive.help
1228 color.interactive.prompt
1232 color.status.changed
1234 color.status.nobranch
1235 color.status.untracked
1236 color.status.updated
1242 core.deltaBaseCacheLimit
1246 core.fsyncobjectfiles
1248 core.ignoreCygwinFSTricks
1250 core.logAllRefUpdates
1251 core.loosecompression
1253 core.packedGitWindowSize
1255 core.preferSymlinkRefs
1258 core.repositoryFormatVersion
1260 core.sharedRepository
1263 core.warnAmbiguousRefs
1266 diff.autorefreshindex
1283 gc.reflogexpireunreachable
1287 gitcvs.dbTableNamePrefix
1297 gui.copyblamethreshold
1301 gui.matchtrackingbranch
1302 gui.newbranchtemplate
1303 gui.pruneduringfetch
1304 gui.spellingdictionary
1320 i18n.logOutputEncoding
1335 mergetool.keepBackup
1337 pack.deltaCacheLimit
1347 receive.denyCurrentBranch
1349 receive.denyNonFastForwards
1352 repack.usedeltabaseoffset
1356 status.relativePaths
1357 status.showUntrackedFiles
1359 transfer.unpackLimit
1370 local subcommands="add rm show prune update"
1371 local subcommand="$(__git_find_subcommand "$subcommands")"
1372 if [ -z "$subcommand" ]; then
1373 __gitcomp "$subcommands"
1377 case "$subcommand" in
1379 __gitcomp "$(__git_remotes)"
1382 local i c='' IFS=$'\n'
1383 for i in $(git --git-dir="$(__gitdir)" config --list); do
1401 __git_has_doubledash && return
1403 local cur="${COMP_WORDS[COMP_CWORD]}"
1406 __gitcomp "--mixed --hard --soft"
1410 __gitcomp "$(__git_refs)"
1415 local cur="${COMP_WORDS[COMP_CWORD]}"
1418 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
1422 __gitcomp "$(__git_refs)"
1427 __git_has_doubledash && return
1429 local cur="${COMP_WORDS[COMP_CWORD]}"
1432 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1441 __git_has_doubledash && return
1443 local cur="${COMP_WORDS[COMP_CWORD]}"
1447 --max-count= --max-age= --since= --after=
1448 --min-age= --before= --until=
1450 --author= --committer= --grep=
1453 --numbered --summary
1458 __git_complete_revlist
1463 __git_has_doubledash && return
1465 local cur="${COMP_WORDS[COMP_CWORD]}"
1469 oneline short medium full fuller email raw
1470 " "" "${cur##--pretty=}"
1474 __gitcomp "--pretty="
1483 local cur="${COMP_WORDS[COMP_CWORD]}"
1487 --all --remotes --topo-order --current --more=
1488 --list --independent --merge-base --no-name
1489 --sha1-name --topics --reflog
1494 __git_complete_revlist
1499 local subcommands='save list show apply clear drop pop create branch'
1500 local subcommand="$(__git_find_subcommand "$subcommands")"
1501 if [ -z "$subcommand" ]; then
1502 __gitcomp "$subcommands"
1504 local cur="${COMP_WORDS[COMP_CWORD]}"
1505 case "$subcommand,$cur" in
1507 __gitcomp "--keep-index"
1512 show,--*|drop,--*|pop,--*|branch,--*)
1515 show,*|apply,*|drop,*|pop,*|branch,*)
1516 __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
1517 | sed -n -e 's/:.*//p')"
1528 __git_has_doubledash && return
1530 local subcommands="add status init update summary foreach sync"
1531 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1532 local cur="${COMP_WORDS[COMP_CWORD]}"
1535 __gitcomp "--quiet --cached"
1538 __gitcomp "$subcommands"
1548 init fetch clone rebase dcommit log find-rev
1549 set-tree commit-diff info create-ignore propget
1550 proplist show-ignore show-externals
1552 local subcommand="$(__git_find_subcommand "$subcommands")"
1553 if [ -z "$subcommand" ]; then
1554 __gitcomp "$subcommands"
1556 local remote_opts="--username= --config-dir= --no-auth-cache"
1558 --follow-parent --authors-file= --repack=
1559 --no-metadata --use-svm-props --use-svnsync-props
1560 --log-window-size= --no-checkout --quiet
1561 --repack-flags --user-log-author $remote_opts
1564 --template= --shared= --trunk= --tags=
1565 --branches= --stdlayout --minimize-url
1566 --no-metadata --use-svm-props --use-svnsync-props
1567 --rewrite-root= $remote_opts
1570 --edit --rmdir --find-copies-harder --copy-similarity=
1573 local cur="${COMP_WORDS[COMP_CWORD]}"
1574 case "$subcommand,$cur" in
1576 __gitcomp "--revision= --fetch-all $fc_opts"
1579 __gitcomp "--revision= $fc_opts $init_opts"
1582 __gitcomp "$init_opts"
1586 --merge --strategy= --verbose --dry-run
1587 --fetch-all --no-rebase $cmt_opts $fc_opts
1591 __gitcomp "--stdin $cmt_opts $fc_opts"
1593 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1595 __gitcomp "--revision="
1599 --limit= --revision= --verbose --incremental
1600 --oneline --show-commit --non-recursive
1606 --merge --verbose --strategy= --local
1607 --fetch-all $fc_opts
1611 __gitcomp "--message= --file= --revision= $cmt_opts"
1626 while [ $c -lt $COMP_CWORD ]; do
1627 i="${COMP_WORDS[c]}"
1630 __gitcomp "$(__git_tags)"
1640 case "${COMP_WORDS[COMP_CWORD-1]}" in
1646 __gitcomp "$(__git_tags)"
1652 __gitcomp "$(__git_refs)"
1659 local i c=1 command __git_dir
1661 while [ $c -lt $COMP_CWORD ]; do
1662 i="${COMP_WORDS[c]}"
1664 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1665 --bare) __git_dir="." ;;
1666 --version|-p|--paginate) ;;
1667 --help) command="help"; break ;;
1668 *) command="$i"; break ;;
1673 if [ -z "$command" ]; then
1674 case "${COMP_WORDS[COMP_CWORD]}" in
1675 --*=*) COMPREPLY=() ;;
1687 *) __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
1692 local expansion=$(__git_aliased_command "$command")
1693 [ "$expansion" ] && command="$expansion"
1698 apply) _git_apply ;;
1699 archive) _git_archive ;;
1700 bisect) _git_bisect ;;
1701 bundle) _git_bundle ;;
1702 branch) _git_branch ;;
1703 checkout) _git_checkout ;;
1704 cherry) _git_cherry ;;
1705 cherry-pick) _git_cherry_pick ;;
1706 clean) _git_clean ;;
1707 clone) _git_clone ;;
1708 commit) _git_commit ;;
1709 config) _git_config ;;
1710 describe) _git_describe ;;
1712 fetch) _git_fetch ;;
1713 format-patch) _git_format_patch ;;
1719 ls-files) _git_ls_files ;;
1720 ls-remote) _git_ls_remote ;;
1721 ls-tree) _git_ls_tree ;;
1723 mergetool) _git_mergetool;;
1724 merge-base) _git_merge_base ;;
1726 name-rev) _git_name_rev ;;
1729 rebase) _git_rebase ;;
1730 remote) _git_remote ;;
1731 reset) _git_reset ;;
1732 revert) _git_revert ;;
1734 send-email) _git_send_email ;;
1735 shortlog) _git_shortlog ;;
1737 show-branch) _git_show_branch ;;
1738 stash) _git_stash ;;
1739 submodule) _git_submodule ;;
1742 whatchanged) _git_log ;;
1749 __git_has_doubledash && return
1751 local cur="${COMP_WORDS[COMP_CWORD]}"
1752 local g="$(git rev-parse --git-dir 2>/dev/null)"
1754 if [ -f $g/MERGE_HEAD ]; then
1759 __gitcomp "--not --all $merge"
1763 __git_complete_revlist
1766 complete -o default -o nospace -F _git git
1767 complete -o default -o nospace -F _gitk gitk
1769 # The following are necessary only for Cygwin, and only are needed
1770 # when the user has tab-completed the executable name and consequently
1771 # included the '.exe' suffix.
1773 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1774 complete -o default -o nospace -F _git git.exe