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 strip"
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)"
893 local cur="${COMP_WORDS[COMP_CWORD]}"
897 false true umask group all world everybody
898 " "" "${cur##--shared=}"
902 __gitcomp "--quiet --bare --template= --shared --shared="
911 __git_has_doubledash && return
913 local cur="${COMP_WORDS[COMP_CWORD]}"
916 __gitcomp "--cached --deleted --modified --others --ignored
917 --stage --directory --no-empty-directory --unmerged
918 --killed --exclude= --exclude-from=
919 --exclude-per-directory= --exclude-standard
920 --error-unmatch --with-tree= --full-name
921 --abbrev --ignored --exclude-per-directory
931 __gitcomp "$(__git_remotes)"
941 __git_has_doubledash && return
943 local cur="${COMP_WORDS[COMP_CWORD]}"
947 oneline short medium full fuller email raw
948 " "" "${cur##--pretty=}"
953 relative iso8601 rfc2822 short local default
954 " "" "${cur##--date=}"
959 --max-count= --max-age= --since= --after=
960 --min-age= --before= --until=
961 --root --topo-order --date-order --reverse
963 --abbrev-commit --abbrev=
964 --relative-date --date=
965 --author= --committer= --grep=
967 --pretty= --name-status --name-only --raw
969 --left-right --cherry-pick
971 --stat --numstat --shortstat
972 --decorate --diff-filter=
973 --color-words --walk-reflogs
974 --parents --children --full-history
979 __git_complete_revlist
984 local cur="${COMP_WORDS[COMP_CWORD]}"
985 case "${COMP_WORDS[COMP_CWORD-1]}" in
987 __gitcomp "$(__git_merge_strategies)"
992 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
997 --no-commit --no-stat --log --no-log --squash --strategy
1001 __gitcomp "$(__git_refs)"
1006 __gitcomp "$(__git_refs)"
1011 __gitcomp "--tags --all --stdin"
1016 local cur="${COMP_WORDS[COMP_CWORD]}"
1018 case "${COMP_WORDS[0]},$COMP_CWORD" in
1020 __gitcomp "$(__git_remotes)"
1023 __gitcomp "$(__git_remotes)"
1027 case "${COMP_WORDS[0]}" in
1028 git-pull) remote="${COMP_WORDS[1]}" ;;
1029 git) remote="${COMP_WORDS[2]}" ;;
1031 __gitcomp "$(__git_refs "$remote")"
1038 local cur="${COMP_WORDS[COMP_CWORD]}"
1040 case "${COMP_WORDS[0]},$COMP_CWORD" in
1042 __gitcomp "$(__git_remotes)"
1045 __gitcomp "$(__git_remotes)"
1051 case "${COMP_WORDS[0]}" in
1052 git-push) remote="${COMP_WORDS[1]}" ;;
1053 git) remote="${COMP_WORDS[2]}" ;;
1057 case "$COMP_WORDBREAKS" in
1059 *) pfx="${cur%%:*}:" ;;
1062 __gitcomp "$(__git_refs "$remote")" "$pfx" "${cur#*:}"
1065 __gitcomp "$(__git_refs)" + "${cur#+}"
1068 __gitcomp "$(__git_refs)"
1077 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
1078 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1079 __gitcomp "--continue --skip --abort"
1082 case "${COMP_WORDS[COMP_CWORD-1]}" in
1084 __gitcomp "$(__git_merge_strategies)"
1089 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
1093 __gitcomp "--onto --merge --strategy --interactive"
1096 __gitcomp "$(__git_refs)"
1101 local cur="${COMP_WORDS[COMP_CWORD]}"
1104 __gitcomp "--bcc --cc --cc-cmd --chain-reply-to --compose
1105 --dry-run --envelope-sender --from --identity
1106 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1107 --no-suppress-from --no-thread --quiet
1108 --signed-off-by-cc --smtp-pass --smtp-server
1109 --smtp-server-port --smtp-ssl --smtp-user --subject
1110 --suppress-cc --suppress-from --thread --to"
1119 local cur="${COMP_WORDS[COMP_CWORD]}"
1120 local prv="${COMP_WORDS[COMP_CWORD-1]}"
1123 __gitcomp "$(__git_remotes)"
1127 __gitcomp "$(__git_refs)"
1131 local remote="${prv#remote.}"
1132 remote="${remote%.fetch}"
1133 __gitcomp "$(__git_refs_remotes "$remote")"
1137 local remote="${prv#remote.}"
1138 remote="${remote%.push}"
1139 __gitcomp "$(git --git-dir="$(__gitdir)" \
1140 for-each-ref --format='%(refname):%(refname)' \
1144 pull.twohead|pull.octopus)
1145 __gitcomp "$(__git_merge_strategies)"
1148 color.branch|color.diff|color.status)
1149 __gitcomp "always never auto"
1154 black red green yellow blue magenta cyan white
1155 bold dim ul blink reverse
1167 --global --system --file=
1168 --list --replace-all
1169 --get --get-all --get-regexp
1170 --add --unset --unset-all
1171 --remove-section --rename-section
1176 local pfx="${cur%.*}."
1178 __gitcomp "remote merge" "$pfx" "$cur"
1182 local pfx="${cur%.*}."
1184 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1188 local pfx="${cur%.*}."
1191 url fetch push skipDefaultUpdate
1192 receivepack uploadpack tagopt
1197 local pfx="${cur%.*}."
1199 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1208 core.preferSymlinkRefs
1209 core.logAllRefUpdates
1210 core.loosecompression
1211 core.repositoryFormatVersion
1212 core.sharedRepository
1213 core.warnAmbiguousRefs
1215 core.packedGitWindowSize
1219 color.branch.current
1230 color.diff.whitespace
1235 color.status.changed
1236 color.status.untracked
1241 format.subjectprefix
1245 gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dbpass
1246 gitcvs.dbtablenameprefix
1249 gc.reflogexpireunreachable
1262 i18n.logOutputEncoding
1272 pack.deltaCacheLimit
1275 repack.useDeltaBaseOffset
1278 transfer.unpackLimit
1280 receive.denyNonFastForwards
1290 local subcommands="add rm show prune update"
1291 local subcommand="$(__git_find_subcommand "$subcommands")"
1292 if [ -z "$subcommand" ]; then
1293 __gitcomp "$subcommands"
1297 case "$subcommand" in
1299 __gitcomp "$(__git_remotes)"
1302 local i c='' IFS=$'\n'
1303 for i in $(git --git-dir="$(__gitdir)" config --list); do
1321 __git_has_doubledash && return
1323 local cur="${COMP_WORDS[COMP_CWORD]}"
1326 __gitcomp "--mixed --hard --soft"
1330 __gitcomp "$(__git_refs)"
1335 local cur="${COMP_WORDS[COMP_CWORD]}"
1338 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
1347 __git_has_doubledash && return
1349 local cur="${COMP_WORDS[COMP_CWORD]}"
1352 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1361 __git_has_doubledash && return
1363 local cur="${COMP_WORDS[COMP_CWORD]}"
1367 --max-count= --max-age= --since= --after=
1368 --min-age= --before= --until=
1370 --author= --committer= --grep=
1373 --numbered --summary
1378 __git_complete_revlist
1383 local cur="${COMP_WORDS[COMP_CWORD]}"
1387 oneline short medium full fuller email raw
1388 " "" "${cur##--pretty=}"
1392 __gitcomp "--pretty="
1401 local cur="${COMP_WORDS[COMP_CWORD]}"
1405 --all --remotes --topo-order --current --more=
1406 --list --independent --merge-base --no-name
1407 --sha1-name --topics --reflog
1412 __git_complete_revlist
1417 local subcommands='save list show apply clear drop pop create branch'
1418 local subcommand="$(__git_find_subcommand "$subcommands")"
1419 if [ -z "$subcommand" ]; then
1420 __gitcomp "$subcommands"
1422 local cur="${COMP_WORDS[COMP_CWORD]}"
1423 case "$subcommand,$cur" in
1425 __gitcomp "--keep-index"
1430 show,--*|apply,--*|drop,--*|pop,--*|branch,--*)
1433 show,*|apply,*|drop,*|pop,*|branch,*)
1434 __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
1435 | sed -n -e 's/:.*//p')"
1446 __git_has_doubledash && return
1448 local subcommands="add status init update"
1449 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1450 local cur="${COMP_WORDS[COMP_CWORD]}"
1453 __gitcomp "--quiet --cached"
1456 __gitcomp "$subcommands"
1466 init fetch clone rebase dcommit log find-rev
1467 set-tree commit-diff info create-ignore propget
1468 proplist show-ignore show-externals
1470 local subcommand="$(__git_find_subcommand "$subcommands")"
1471 if [ -z "$subcommand" ]; then
1472 __gitcomp "$subcommands"
1474 local remote_opts="--username= --config-dir= --no-auth-cache"
1476 --follow-parent --authors-file= --repack=
1477 --no-metadata --use-svm-props --use-svnsync-props
1478 --log-window-size= --no-checkout --quiet
1479 --repack-flags --user-log-author $remote_opts
1482 --template= --shared= --trunk= --tags=
1483 --branches= --stdlayout --minimize-url
1484 --no-metadata --use-svm-props --use-svnsync-props
1485 --rewrite-root= $remote_opts
1488 --edit --rmdir --find-copies-harder --copy-similarity=
1491 local cur="${COMP_WORDS[COMP_CWORD]}"
1492 case "$subcommand,$cur" in
1494 __gitcomp "--revision= --fetch-all $fc_opts"
1497 __gitcomp "--revision= $fc_opts $init_opts"
1500 __gitcomp "$init_opts"
1504 --merge --strategy= --verbose --dry-run
1505 --fetch-all --no-rebase $cmt_opts $fc_opts
1509 __gitcomp "--stdin $cmt_opts $fc_opts"
1511 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1513 __gitcomp "--revision="
1517 --limit= --revision= --verbose --incremental
1518 --oneline --show-commit --non-recursive
1524 --merge --verbose --strategy= --local
1525 --fetch-all $fc_opts
1529 __gitcomp "--message= --file= --revision= $cmt_opts"
1544 while [ $c -lt $COMP_CWORD ]; do
1545 i="${COMP_WORDS[c]}"
1548 __gitcomp "$(__git_tags)"
1558 case "${COMP_WORDS[COMP_CWORD-1]}" in
1564 __gitcomp "$(__git_tags)"
1570 __gitcomp "$(__git_refs)"
1577 local i c=1 command __git_dir
1579 while [ $c -lt $COMP_CWORD ]; do
1580 i="${COMP_WORDS[c]}"
1582 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1583 --bare) __git_dir="." ;;
1584 --version|-p|--paginate) ;;
1585 --help) command="help"; break ;;
1586 *) command="$i"; break ;;
1591 if [ -z "$command" ]; then
1592 case "${COMP_WORDS[COMP_CWORD]}" in
1593 --*=*) COMPREPLY=() ;;
1605 *) __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
1610 local expansion=$(__git_aliased_command "$command")
1611 [ "$expansion" ] && command="$expansion"
1616 apply) _git_apply ;;
1617 archive) _git_archive ;;
1618 bisect) _git_bisect ;;
1619 bundle) _git_bundle ;;
1620 branch) _git_branch ;;
1621 checkout) _git_checkout ;;
1622 cherry) _git_cherry ;;
1623 cherry-pick) _git_cherry_pick ;;
1624 clean) _git_clean ;;
1625 clone) _git_clone ;;
1626 commit) _git_commit ;;
1627 config) _git_config ;;
1628 describe) _git_describe ;;
1630 fetch) _git_fetch ;;
1631 format-patch) _git_format_patch ;;
1637 ls-files) _git_ls_files ;;
1638 ls-remote) _git_ls_remote ;;
1639 ls-tree) _git_ls_tree ;;
1641 merge-base) _git_merge_base ;;
1642 name-rev) _git_name_rev ;;
1645 rebase) _git_rebase ;;
1646 remote) _git_remote ;;
1647 reset) _git_reset ;;
1648 revert) _git_revert ;;
1650 send-email) _git_send_email ;;
1651 shortlog) _git_shortlog ;;
1653 show-branch) _git_show_branch ;;
1654 stash) _git_stash ;;
1655 submodule) _git_submodule ;;
1658 whatchanged) _git_log ;;
1665 __git_has_doubledash && return
1667 local cur="${COMP_WORDS[COMP_CWORD]}"
1668 local g="$(git rev-parse --git-dir 2>/dev/null)"
1670 if [ -f $g/MERGE_HEAD ]; then
1675 __gitcomp "--not --all $merge"
1679 __git_complete_revlist
1682 complete -o default -o nospace -F _git git
1683 complete -o default -o nospace -F _gitk gitk
1685 # The following are necessary only for Cygwin, and only are needed
1686 # when the user has tab-completed the executable name and consequently
1687 # included the '.exe' suffix.
1689 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1690 complete -o default -o nospace -F _git git.exe