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 for i in $(git --git-dir="$dir" \
158 for-each-ref --format='%(refname)' \
160 echo "${i#refs/heads/}"
164 for i in $(git ls-remote "$1" 2>/dev/null); do
165 case "$is_hash,$i" in
168 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
169 n,*) is_hash=y; echo "$i" ;;
176 local cmd i is_hash=y dir="$(__gitdir "$1")"
177 if [ -d "$dir" ]; then
178 for i in $(git --git-dir="$dir" \
179 for-each-ref --format='%(refname)' \
181 echo "${i#refs/tags/}"
185 for i in $(git ls-remote "$1" 2>/dev/null); do
186 case "$is_hash,$i" in
189 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
190 n,*) is_hash=y; echo "$i" ;;
197 local cmd i is_hash=y dir="$(__gitdir "$1")"
198 if [ -d "$dir" ]; then
199 if [ -e "$dir/HEAD" ]; then echo HEAD; fi
200 for i in $(git --git-dir="$dir" \
201 for-each-ref --format='%(refname)' \
202 refs/tags refs/heads refs/remotes); do
204 refs/tags/*) echo "${i#refs/tags/}" ;;
205 refs/heads/*) echo "${i#refs/heads/}" ;;
206 refs/remotes/*) echo "${i#refs/remotes/}" ;;
212 for i in $(git ls-remote "$dir" 2>/dev/null); do
213 case "$is_hash,$i" in
216 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
217 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
218 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
219 n,*) is_hash=y; echo "$i" ;;
227 for i in $(__git_refs "$1"); do
232 __git_refs_remotes ()
234 local cmd i is_hash=y
235 for i in $(git ls-remote "$1" 2>/dev/null); do
236 case "$is_hash,$i" in
239 echo "$i:refs/remotes/$1/${i#refs/heads/}"
243 n,refs/tags/*) is_hash=y;;
251 local i ngoff IFS=$'\n' d="$(__gitdir)"
252 shopt -q nullglob || ngoff=1
254 for i in "$d/remotes"/*; do
255 echo ${i#$d/remotes/}
257 [ "$ngoff" ] && shopt -u nullglob
258 for i in $(git --git-dir="$d" config --list); do
268 __git_merge_strategies ()
270 if [ -n "$__git_merge_strategylist" ]; then
271 echo "$__git_merge_strategylist"
274 sed -n "/^all_strategies='/{
275 s/^all_strategies='//
279 }" "$(git --exec-path)/git-merge"
281 __git_merge_strategylist=
282 __git_merge_strategylist="$(__git_merge_strategies 2>/dev/null)"
284 __git_complete_file ()
286 local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
303 case "$COMP_WORDBREAKS" in
305 *) pfx="$ref:$pfx" ;;
309 COMPREPLY=($(compgen -P "$pfx" \
310 -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
311 | sed '/^100... blob /{
327 __gitcomp "$(__git_refs)"
332 __git_complete_revlist ()
334 local pfx cur="${COMP_WORDS[COMP_CWORD]}"
339 __gitcomp "$(__git_refs)" "$pfx" "$cur"
344 __gitcomp "$(__git_refs)" "$pfx" "$cur"
347 __gitcomp "$(__git_refs)"
352 __git_all_commands ()
354 if [ -n "$__git_all_commandlist" ]; then
355 echo "$__git_all_commandlist"
359 for i in $(git help -a|egrep '^ ')
362 *--*) : helper pattern;;
367 __git_all_commandlist=
368 __git_all_commandlist="$(__git_all_commands 2>/dev/null)"
370 __git_porcelain_commands ()
372 if [ -n "$__git_porcelain_commandlist" ]; then
373 echo "$__git_porcelain_commandlist"
377 for i in "help" $(__git_all_commands)
380 *--*) : helper pattern;;
381 applymbox) : ask gittus;;
382 applypatch) : ask gittus;;
383 archimport) : import;;
384 cat-file) : plumbing;;
385 check-attr) : plumbing;;
386 check-ref-format) : plumbing;;
387 commit-tree) : plumbing;;
388 cvsexportcommit) : export;;
389 cvsimport) : import;;
390 cvsserver) : daemon;;
392 diff-files) : plumbing;;
393 diff-index) : plumbing;;
394 diff-tree) : plumbing;;
395 fast-import) : import;;
396 fsck-objects) : plumbing;;
397 fetch-pack) : plumbing;;
398 fmt-merge-msg) : plumbing;;
399 for-each-ref) : plumbing;;
400 hash-object) : plumbing;;
401 http-*) : transport;;
402 index-pack) : plumbing;;
403 init-db) : deprecated;;
404 local-fetch) : plumbing;;
405 mailinfo) : plumbing;;
406 mailsplit) : plumbing;;
407 merge-*) : plumbing;;
410 pack-objects) : plumbing;;
411 pack-redundant) : plumbing;;
412 pack-refs) : plumbing;;
413 parse-remote) : plumbing;;
414 patch-id) : plumbing;;
415 peek-remote) : plumbing;;
417 prune-packed) : plumbing;;
418 quiltimport) : import;;
419 read-tree) : plumbing;;
420 receive-pack) : plumbing;;
422 repo-config) : deprecated;;
424 rev-list) : plumbing;;
425 rev-parse) : plumbing;;
426 runstatus) : plumbing;;
427 sh-setup) : internal;;
429 send-pack) : plumbing;;
430 show-index) : plumbing;;
432 stripspace) : plumbing;;
433 symbolic-ref) : plumbing;;
434 tar-tree) : deprecated;;
435 unpack-file) : plumbing;;
436 unpack-objects) : plumbing;;
437 update-index) : plumbing;;
438 update-ref) : plumbing;;
439 update-server-info) : daemon;;
440 upload-archive) : plumbing;;
441 upload-pack) : plumbing;;
442 write-tree) : plumbing;;
443 verify-tag) : plumbing;;
448 __git_porcelain_commandlist=
449 __git_porcelain_commandlist="$(__git_porcelain_commands 2>/dev/null)"
454 for i in $(git --git-dir="$(__gitdir)" config --list); do
464 __git_aliased_command ()
466 local word cmdline=$(git --git-dir="$(__gitdir)" \
467 config --get "alias.$1")
468 for word in $cmdline; do
469 if [ "${word##-*}" ]; then
476 __git_find_subcommand ()
478 local word subcommand c=1
480 while [ $c -lt $COMP_CWORD ]; do
481 word="${COMP_WORDS[c]}"
482 for subcommand in $1; do
483 if [ "$subcommand" = "$word" ]; then
492 __git_has_doubledash ()
495 while [ $c -lt $COMP_CWORD ]; do
496 if [ "--" = "${COMP_WORDS[c]}" ]; then
504 __git_whitespacelist="nowarn warn error error-all fix"
508 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
509 if [ -d "$dir"/rebase-apply ]; then
510 __gitcomp "--skip --resolved --abort"
515 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
520 --signoff --utf8 --binary --3way --interactive
530 local cur="${COMP_WORDS[COMP_CWORD]}"
533 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
538 --stat --numstat --summary --check --index
539 --cached --index-info --reverse --reject --unidiff-zero
540 --apply --no-add --exclude=
541 --whitespace= --inaccurate-eof --verbose
550 __git_has_doubledash && return
552 local cur="${COMP_WORDS[COMP_CWORD]}"
556 --interactive --refresh --patch --update --dry-run
566 local cur="${COMP_WORDS[COMP_CWORD]}"
569 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
573 __gitcomp "$(__git_remotes)" "" "${cur##--remote=}"
578 --format= --list --verbose
579 --prefix= --remote= --exec=
589 __git_has_doubledash && return
591 local subcommands="start bad good skip reset visualize replay log run"
592 local subcommand="$(__git_find_subcommand "$subcommands")"
593 if [ -z "$subcommand" ]; then
594 __gitcomp "$subcommands"
598 case "$subcommand" in
600 __gitcomp "$(__git_refs)"
610 local i c=1 only_local_ref="n" has_r="n"
612 while [ $c -lt $COMP_CWORD ]; do
615 -d|-m) only_local_ref="y" ;;
621 case "${COMP_WORDS[COMP_CWORD]}" in
622 --*=*) COMPREPLY=() ;;
625 --color --no-color --verbose --abbrev= --no-abbrev
626 --track --no-track --contains --merged --no-merged
630 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
631 __gitcomp "$(__git_heads)"
633 __gitcomp "$(__git_refs)"
641 local mycword="$COMP_CWORD"
642 case "${COMP_WORDS[0]}" in
644 local cmd="${COMP_WORDS[2]}"
645 mycword="$((mycword-1))"
648 local cmd="${COMP_WORDS[1]}"
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
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 case "${COMP_WORDS[0]},$COMP_CWORD" in
792 __gitcomp "$(__git_remotes)"
795 __gitcomp "$(__git_remotes)"
801 case "$COMP_WORDBREAKS" in
803 *) pfx="${cur%%:*}:" ;;
805 __gitcomp "$(__git_refs)" "$pfx" "${cur#*:}"
809 case "${COMP_WORDS[0]}" in
810 git-fetch) remote="${COMP_WORDS[1]}" ;;
811 git) remote="${COMP_WORDS[2]}" ;;
813 __gitcomp "$(__git_refs2 "$remote")"
822 local cur="${COMP_WORDS[COMP_CWORD]}"
826 --stdout --attach --thread
828 --numbered --start-number
833 --full-index --binary
836 --no-prefix --src-prefix= --dst-prefix=
841 __git_complete_revlist
846 local cur="${COMP_WORDS[COMP_CWORD]}"
849 __gitcomp "--prune --aggressive"
858 __git_has_doubledash && return
860 local cur="${COMP_WORDS[COMP_CWORD]}"
865 --text --ignore-case --word-regexp --invert-match
867 --extended-regexp --basic-regexp --fixed-strings
868 --files-with-matches --name-only
869 --files-without-match
871 --and --or --not --all-match
881 local cur="${COMP_WORDS[COMP_CWORD]}"
884 __gitcomp "--all --info --man --web"
888 __gitcomp "$(__git_all_commands)
889 attributes cli core-tutorial cvs-migration
890 diffcore gitk glossary hooks ignore modules
891 repository-layout tutorial tutorial-2
897 local cur="${COMP_WORDS[COMP_CWORD]}"
901 false true umask group all world everybody
902 " "" "${cur##--shared=}"
906 __gitcomp "--quiet --bare --template= --shared --shared="
915 __git_has_doubledash && return
917 local cur="${COMP_WORDS[COMP_CWORD]}"
920 __gitcomp "--cached --deleted --modified --others --ignored
921 --stage --directory --no-empty-directory --unmerged
922 --killed --exclude= --exclude-from=
923 --exclude-per-directory= --exclude-standard
924 --error-unmatch --with-tree= --full-name
925 --abbrev --ignored --exclude-per-directory
935 __gitcomp "$(__git_remotes)"
945 __git_has_doubledash && return
947 local cur="${COMP_WORDS[COMP_CWORD]}"
951 oneline short medium full fuller email raw
952 " "" "${cur##--pretty=}"
957 relative iso8601 rfc2822 short local default
958 " "" "${cur##--date=}"
963 --max-count= --max-age= --since= --after=
964 --min-age= --before= --until=
965 --root --topo-order --date-order --reverse
967 --abbrev-commit --abbrev=
968 --relative-date --date=
969 --author= --committer= --grep=
971 --pretty= --name-status --name-only --raw
973 --left-right --cherry-pick
975 --stat --numstat --shortstat
976 --decorate --diff-filter=
977 --color-words --walk-reflogs
978 --parents --children --full-history
984 __git_complete_revlist
989 local cur="${COMP_WORDS[COMP_CWORD]}"
990 case "${COMP_WORDS[COMP_CWORD-1]}" in
992 __gitcomp "$(__git_merge_strategies)"
997 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
1002 --no-commit --no-stat --log --no-log --squash --strategy
1006 __gitcomp "$(__git_refs)"
1011 local cur="${COMP_WORDS[COMP_CWORD]}"
1015 kdiff3 tkdiff meld xxdiff emerge
1016 vimdiff gvimdiff ecmerge opendiff
1017 " "" "${cur##--tool=}"
1030 __gitcomp "$(__git_refs)"
1035 local cur="${COMP_WORDS[COMP_CWORD]}"
1038 __gitcomp "--dry-run"
1047 __gitcomp "--tags --all --stdin"
1052 local cur="${COMP_WORDS[COMP_CWORD]}"
1054 case "${COMP_WORDS[0]},$COMP_CWORD" in
1056 __gitcomp "$(__git_remotes)"
1059 __gitcomp "$(__git_remotes)"
1063 case "${COMP_WORDS[0]}" in
1064 git-pull) remote="${COMP_WORDS[1]}" ;;
1065 git) remote="${COMP_WORDS[2]}" ;;
1067 __gitcomp "$(__git_refs "$remote")"
1074 local cur="${COMP_WORDS[COMP_CWORD]}"
1076 case "${COMP_WORDS[0]},$COMP_CWORD" in
1078 __gitcomp "$(__git_remotes)"
1081 __gitcomp "$(__git_remotes)"
1087 case "${COMP_WORDS[0]}" in
1088 git-push) remote="${COMP_WORDS[1]}" ;;
1089 git) remote="${COMP_WORDS[2]}" ;;
1093 case "$COMP_WORDBREAKS" in
1095 *) pfx="${cur%%:*}:" ;;
1098 __gitcomp "$(__git_refs "$remote")" "$pfx" "${cur#*:}"
1101 __gitcomp "$(__git_refs)" + "${cur#+}"
1104 __gitcomp "$(__git_refs)"
1113 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
1114 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1115 __gitcomp "--continue --skip --abort"
1118 case "${COMP_WORDS[COMP_CWORD-1]}" in
1120 __gitcomp "$(__git_merge_strategies)"
1125 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
1129 __gitcomp "--onto --merge --strategy --interactive"
1132 __gitcomp "$(__git_refs)"
1137 local cur="${COMP_WORDS[COMP_CWORD]}"
1140 __gitcomp "--bcc --cc --cc-cmd --chain-reply-to --compose
1141 --dry-run --envelope-sender --from --identity
1142 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1143 --no-suppress-from --no-thread --quiet
1144 --signed-off-by-cc --smtp-pass --smtp-server
1145 --smtp-server-port --smtp-ssl --smtp-user --subject
1146 --suppress-cc --suppress-from --thread --to"
1155 local cur="${COMP_WORDS[COMP_CWORD]}"
1156 local prv="${COMP_WORDS[COMP_CWORD-1]}"
1159 __gitcomp "$(__git_remotes)"
1163 __gitcomp "$(__git_refs)"
1167 local remote="${prv#remote.}"
1168 remote="${remote%.fetch}"
1169 __gitcomp "$(__git_refs_remotes "$remote")"
1173 local remote="${prv#remote.}"
1174 remote="${remote%.push}"
1175 __gitcomp "$(git --git-dir="$(__gitdir)" \
1176 for-each-ref --format='%(refname):%(refname)' \
1180 pull.twohead|pull.octopus)
1181 __gitcomp "$(__git_merge_strategies)"
1184 color.branch|color.diff|color.status)
1185 __gitcomp "always never auto"
1190 black red green yellow blue magenta cyan white
1191 bold dim ul blink reverse
1203 --global --system --file=
1204 --list --replace-all
1205 --get --get-all --get-regexp
1206 --add --unset --unset-all
1207 --remove-section --rename-section
1212 local pfx="${cur%.*}."
1214 __gitcomp "remote merge" "$pfx" "$cur"
1218 local pfx="${cur%.*}."
1220 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1224 local pfx="${cur%.*}."
1227 url fetch push skipDefaultUpdate
1228 receivepack uploadpack tagopt
1233 local pfx="${cur%.*}."
1235 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1244 core.preferSymlinkRefs
1245 core.logAllRefUpdates
1246 core.loosecompression
1247 core.repositoryFormatVersion
1248 core.sharedRepository
1249 core.warnAmbiguousRefs
1251 core.packedGitWindowSize
1255 color.branch.current
1266 color.diff.whitespace
1271 color.status.changed
1272 color.status.untracked
1277 format.subjectprefix
1281 gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dbpass
1282 gitcvs.dbtablenameprefix
1285 gc.reflogexpireunreachable
1298 i18n.logOutputEncoding
1308 pack.deltaCacheLimit
1311 repack.useDeltaBaseOffset
1314 transfer.unpackLimit
1316 receive.denyNonFastForwards
1326 local subcommands="add rm show prune update"
1327 local subcommand="$(__git_find_subcommand "$subcommands")"
1328 if [ -z "$subcommand" ]; then
1329 __gitcomp "$subcommands"
1333 case "$subcommand" in
1335 __gitcomp "$(__git_remotes)"
1338 local i c='' IFS=$'\n'
1339 for i in $(git --git-dir="$(__gitdir)" config --list); do
1357 __git_has_doubledash && return
1359 local cur="${COMP_WORDS[COMP_CWORD]}"
1362 __gitcomp "--mixed --hard --soft"
1366 __gitcomp "$(__git_refs)"
1371 local cur="${COMP_WORDS[COMP_CWORD]}"
1374 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
1383 __git_has_doubledash && return
1385 local cur="${COMP_WORDS[COMP_CWORD]}"
1388 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1397 __git_has_doubledash && return
1399 local cur="${COMP_WORDS[COMP_CWORD]}"
1403 --max-count= --max-age= --since= --after=
1404 --min-age= --before= --until=
1406 --author= --committer= --grep=
1409 --numbered --summary
1414 __git_complete_revlist
1419 local cur="${COMP_WORDS[COMP_CWORD]}"
1423 oneline short medium full fuller email raw
1424 " "" "${cur##--pretty=}"
1428 __gitcomp "--pretty="
1437 local cur="${COMP_WORDS[COMP_CWORD]}"
1441 --all --remotes --topo-order --current --more=
1442 --list --independent --merge-base --no-name
1443 --sha1-name --topics --reflog
1448 __git_complete_revlist
1453 local subcommands='save list show apply clear drop pop create branch'
1454 local subcommand="$(__git_find_subcommand "$subcommands")"
1455 if [ -z "$subcommand" ]; then
1456 __gitcomp "$subcommands"
1458 local cur="${COMP_WORDS[COMP_CWORD]}"
1459 case "$subcommand,$cur" in
1461 __gitcomp "--keep-index"
1466 show,--*|drop,--*|pop,--*|branch,--*)
1469 show,*|apply,*|drop,*|pop,*|branch,*)
1470 __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
1471 | sed -n -e 's/:.*//p')"
1482 __git_has_doubledash && return
1484 local subcommands="add status init update"
1485 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1486 local cur="${COMP_WORDS[COMP_CWORD]}"
1489 __gitcomp "--quiet --cached"
1492 __gitcomp "$subcommands"
1502 init fetch clone rebase dcommit log find-rev
1503 set-tree commit-diff info create-ignore propget
1504 proplist show-ignore show-externals
1506 local subcommand="$(__git_find_subcommand "$subcommands")"
1507 if [ -z "$subcommand" ]; then
1508 __gitcomp "$subcommands"
1510 local remote_opts="--username= --config-dir= --no-auth-cache"
1512 --follow-parent --authors-file= --repack=
1513 --no-metadata --use-svm-props --use-svnsync-props
1514 --log-window-size= --no-checkout --quiet
1515 --repack-flags --user-log-author $remote_opts
1518 --template= --shared= --trunk= --tags=
1519 --branches= --stdlayout --minimize-url
1520 --no-metadata --use-svm-props --use-svnsync-props
1521 --rewrite-root= $remote_opts
1524 --edit --rmdir --find-copies-harder --copy-similarity=
1527 local cur="${COMP_WORDS[COMP_CWORD]}"
1528 case "$subcommand,$cur" in
1530 __gitcomp "--revision= --fetch-all $fc_opts"
1533 __gitcomp "--revision= $fc_opts $init_opts"
1536 __gitcomp "$init_opts"
1540 --merge --strategy= --verbose --dry-run
1541 --fetch-all --no-rebase $cmt_opts $fc_opts
1545 __gitcomp "--stdin $cmt_opts $fc_opts"
1547 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1549 __gitcomp "--revision="
1553 --limit= --revision= --verbose --incremental
1554 --oneline --show-commit --non-recursive
1560 --merge --verbose --strategy= --local
1561 --fetch-all $fc_opts
1565 __gitcomp "--message= --file= --revision= $cmt_opts"
1580 while [ $c -lt $COMP_CWORD ]; do
1581 i="${COMP_WORDS[c]}"
1584 __gitcomp "$(__git_tags)"
1594 case "${COMP_WORDS[COMP_CWORD-1]}" in
1600 __gitcomp "$(__git_tags)"
1606 __gitcomp "$(__git_refs)"
1613 local i c=1 command __git_dir
1615 while [ $c -lt $COMP_CWORD ]; do
1616 i="${COMP_WORDS[c]}"
1618 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1619 --bare) __git_dir="." ;;
1620 --version|-p|--paginate) ;;
1621 --help) command="help"; break ;;
1622 *) command="$i"; break ;;
1627 if [ -z "$command" ]; then
1628 case "${COMP_WORDS[COMP_CWORD]}" in
1629 --*=*) COMPREPLY=() ;;
1641 *) __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
1646 local expansion=$(__git_aliased_command "$command")
1647 [ "$expansion" ] && command="$expansion"
1652 apply) _git_apply ;;
1653 archive) _git_archive ;;
1654 bisect) _git_bisect ;;
1655 bundle) _git_bundle ;;
1656 branch) _git_branch ;;
1657 checkout) _git_checkout ;;
1658 cherry) _git_cherry ;;
1659 cherry-pick) _git_cherry_pick ;;
1660 clean) _git_clean ;;
1661 clone) _git_clone ;;
1662 commit) _git_commit ;;
1663 config) _git_config ;;
1664 describe) _git_describe ;;
1666 fetch) _git_fetch ;;
1667 format-patch) _git_format_patch ;;
1673 ls-files) _git_ls_files ;;
1674 ls-remote) _git_ls_remote ;;
1675 ls-tree) _git_ls_tree ;;
1677 mergetool) _git_mergetool;;
1678 merge-base) _git_merge_base ;;
1680 name-rev) _git_name_rev ;;
1683 rebase) _git_rebase ;;
1684 remote) _git_remote ;;
1685 reset) _git_reset ;;
1686 revert) _git_revert ;;
1688 send-email) _git_send_email ;;
1689 shortlog) _git_shortlog ;;
1691 show-branch) _git_show_branch ;;
1692 stash) _git_stash ;;
1693 submodule) _git_submodule ;;
1696 whatchanged) _git_log ;;
1703 __git_has_doubledash && return
1705 local cur="${COMP_WORDS[COMP_CWORD]}"
1706 local g="$(git rev-parse --git-dir 2>/dev/null)"
1708 if [ -f $g/MERGE_HEAD ]; then
1713 __gitcomp "--not --all $merge"
1717 __git_complete_revlist
1720 complete -o default -o nospace -F _git git
1721 complete -o default -o nospace -F _gitk gitk
1723 # The following are necessary only for Cygwin, and only are needed
1724 # when the user has tab-completed the executable name and consequently
1725 # included the '.exe' suffix.
1727 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1728 complete -o default -o nospace -F _git git.exe