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 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" "$pfx" "$cur"
1186 local pfx="${cur%.*}."
1188 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1192 local pfx="${cur%.*}."
1195 url fetch push skipDefaultUpdate
1196 receivepack uploadpack tagopt
1201 local pfx="${cur%.*}."
1203 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1212 core.preferSymlinkRefs
1213 core.logAllRefUpdates
1214 core.loosecompression
1215 core.repositoryFormatVersion
1216 core.sharedRepository
1217 core.warnAmbiguousRefs
1219 core.packedGitWindowSize
1223 color.branch.current
1234 color.diff.whitespace
1239 color.status.changed
1240 color.status.untracked
1245 format.subjectprefix
1249 gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dbpass
1250 gitcvs.dbtablenameprefix
1253 gc.reflogexpireunreachable
1266 i18n.logOutputEncoding
1276 pack.deltaCacheLimit
1279 repack.useDeltaBaseOffset
1282 transfer.unpackLimit
1284 receive.denyNonFastForwards
1294 local subcommands="add rm show prune update"
1295 local subcommand="$(__git_find_subcommand "$subcommands")"
1296 if [ -z "$subcommand" ]; then
1297 __gitcomp "$subcommands"
1301 case "$subcommand" in
1303 __gitcomp "$(__git_remotes)"
1306 local i c='' IFS=$'\n'
1307 for i in $(git --git-dir="$(__gitdir)" config --list); do
1325 __git_has_doubledash && return
1327 local cur="${COMP_WORDS[COMP_CWORD]}"
1330 __gitcomp "--mixed --hard --soft"
1334 __gitcomp "$(__git_refs)"
1339 local cur="${COMP_WORDS[COMP_CWORD]}"
1342 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
1346 __gitcomp "$(__git_refs)"
1351 __git_has_doubledash && return
1353 local cur="${COMP_WORDS[COMP_CWORD]}"
1356 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1365 __git_has_doubledash && return
1367 local cur="${COMP_WORDS[COMP_CWORD]}"
1371 --max-count= --max-age= --since= --after=
1372 --min-age= --before= --until=
1374 --author= --committer= --grep=
1377 --numbered --summary
1382 __git_complete_revlist
1387 __git_has_doubledash && return
1389 local cur="${COMP_WORDS[COMP_CWORD]}"
1393 oneline short medium full fuller email raw
1394 " "" "${cur##--pretty=}"
1398 __gitcomp "--pretty="
1407 local cur="${COMP_WORDS[COMP_CWORD]}"
1411 --all --remotes --topo-order --current --more=
1412 --list --independent --merge-base --no-name
1413 --sha1-name --topics --reflog
1418 __git_complete_revlist
1423 local subcommands='save list show apply clear drop pop create branch'
1424 local subcommand="$(__git_find_subcommand "$subcommands")"
1425 if [ -z "$subcommand" ]; then
1426 __gitcomp "$subcommands"
1428 local cur="${COMP_WORDS[COMP_CWORD]}"
1429 case "$subcommand,$cur" in
1431 __gitcomp "--keep-index"
1436 show,--*|drop,--*|pop,--*|branch,--*)
1439 show,*|apply,*|drop,*|pop,*|branch,*)
1440 __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
1441 | sed -n -e 's/:.*//p')"
1452 __git_has_doubledash && return
1454 local subcommands="add status init update summary foreach sync"
1455 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1456 local cur="${COMP_WORDS[COMP_CWORD]}"
1459 __gitcomp "--quiet --cached"
1462 __gitcomp "$subcommands"
1472 init fetch clone rebase dcommit log find-rev
1473 set-tree commit-diff info create-ignore propget
1474 proplist show-ignore show-externals
1476 local subcommand="$(__git_find_subcommand "$subcommands")"
1477 if [ -z "$subcommand" ]; then
1478 __gitcomp "$subcommands"
1480 local remote_opts="--username= --config-dir= --no-auth-cache"
1482 --follow-parent --authors-file= --repack=
1483 --no-metadata --use-svm-props --use-svnsync-props
1484 --log-window-size= --no-checkout --quiet
1485 --repack-flags --user-log-author $remote_opts
1488 --template= --shared= --trunk= --tags=
1489 --branches= --stdlayout --minimize-url
1490 --no-metadata --use-svm-props --use-svnsync-props
1491 --rewrite-root= $remote_opts
1494 --edit --rmdir --find-copies-harder --copy-similarity=
1497 local cur="${COMP_WORDS[COMP_CWORD]}"
1498 case "$subcommand,$cur" in
1500 __gitcomp "--revision= --fetch-all $fc_opts"
1503 __gitcomp "--revision= $fc_opts $init_opts"
1506 __gitcomp "$init_opts"
1510 --merge --strategy= --verbose --dry-run
1511 --fetch-all --no-rebase $cmt_opts $fc_opts
1515 __gitcomp "--stdin $cmt_opts $fc_opts"
1517 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1519 __gitcomp "--revision="
1523 --limit= --revision= --verbose --incremental
1524 --oneline --show-commit --non-recursive
1530 --merge --verbose --strategy= --local
1531 --fetch-all $fc_opts
1535 __gitcomp "--message= --file= --revision= $cmt_opts"
1550 while [ $c -lt $COMP_CWORD ]; do
1551 i="${COMP_WORDS[c]}"
1554 __gitcomp "$(__git_tags)"
1564 case "${COMP_WORDS[COMP_CWORD-1]}" in
1570 __gitcomp "$(__git_tags)"
1576 __gitcomp "$(__git_refs)"
1583 local i c=1 command __git_dir
1585 while [ $c -lt $COMP_CWORD ]; do
1586 i="${COMP_WORDS[c]}"
1588 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1589 --bare) __git_dir="." ;;
1590 --version|-p|--paginate) ;;
1591 --help) command="help"; break ;;
1592 *) command="$i"; break ;;
1597 if [ -z "$command" ]; then
1598 case "${COMP_WORDS[COMP_CWORD]}" in
1599 --*=*) COMPREPLY=() ;;
1611 *) __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
1616 local expansion=$(__git_aliased_command "$command")
1617 [ "$expansion" ] && command="$expansion"
1622 apply) _git_apply ;;
1623 archive) _git_archive ;;
1624 bisect) _git_bisect ;;
1625 bundle) _git_bundle ;;
1626 branch) _git_branch ;;
1627 checkout) _git_checkout ;;
1628 cherry) _git_cherry ;;
1629 cherry-pick) _git_cherry_pick ;;
1630 clean) _git_clean ;;
1631 clone) _git_clone ;;
1632 commit) _git_commit ;;
1633 config) _git_config ;;
1634 describe) _git_describe ;;
1636 fetch) _git_fetch ;;
1637 format-patch) _git_format_patch ;;
1643 ls-files) _git_ls_files ;;
1644 ls-remote) _git_ls_remote ;;
1645 ls-tree) _git_ls_tree ;;
1647 mergetool) _git_mergetool;;
1648 merge-base) _git_merge_base ;;
1650 name-rev) _git_name_rev ;;
1653 rebase) _git_rebase ;;
1654 remote) _git_remote ;;
1655 reset) _git_reset ;;
1656 revert) _git_revert ;;
1658 send-email) _git_send_email ;;
1659 shortlog) _git_shortlog ;;
1661 show-branch) _git_show_branch ;;
1662 stash) _git_stash ;;
1663 submodule) _git_submodule ;;
1666 whatchanged) _git_log ;;
1673 __git_has_doubledash && return
1675 local cur="${COMP_WORDS[COMP_CWORD]}"
1676 local g="$(git rev-parse --git-dir 2>/dev/null)"
1678 if [ -f $g/MERGE_HEAD ]; then
1683 __gitcomp "--not --all $merge"
1687 __git_complete_revlist
1690 complete -o default -o nospace -F _git git
1691 complete -o default -o nospace -F _gitk gitk
1693 # The following are necessary only for Cygwin, and only are needed
1694 # when the user has tab-completed the executable name and consequently
1695 # included the '.exe' suffix.
1697 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1698 complete -o default -o nospace -F _git git.exe