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 __gitcomp "$(__git_remotes)"
921 __git_has_doubledash && return
923 local cur="${COMP_WORDS[COMP_CWORD]}"
927 oneline short medium full fuller email raw
928 " "" "${cur##--pretty=}"
933 relative iso8601 rfc2822 short local default
934 " "" "${cur##--date=}"
939 --max-count= --max-age= --since= --after=
940 --min-age= --before= --until=
941 --root --topo-order --date-order --reverse
943 --abbrev-commit --abbrev=
944 --relative-date --date=
945 --author= --committer= --grep=
947 --pretty= --name-status --name-only --raw
949 --left-right --cherry-pick
951 --stat --numstat --shortstat
952 --decorate --diff-filter=
953 --color-words --walk-reflogs
954 --parents --children --full-history
959 __git_complete_revlist
964 local cur="${COMP_WORDS[COMP_CWORD]}"
965 case "${COMP_WORDS[COMP_CWORD-1]}" in
967 __gitcomp "$(__git_merge_strategies)"
972 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
977 --no-commit --no-stat --log --no-log --squash --strategy
981 __gitcomp "$(__git_refs)"
986 __gitcomp "$(__git_refs)"
991 __gitcomp "--tags --all --stdin"
996 local cur="${COMP_WORDS[COMP_CWORD]}"
998 case "${COMP_WORDS[0]},$COMP_CWORD" in
1000 __gitcomp "$(__git_remotes)"
1003 __gitcomp "$(__git_remotes)"
1007 case "${COMP_WORDS[0]}" in
1008 git-pull) remote="${COMP_WORDS[1]}" ;;
1009 git) remote="${COMP_WORDS[2]}" ;;
1011 __gitcomp "$(__git_refs "$remote")"
1018 local cur="${COMP_WORDS[COMP_CWORD]}"
1020 case "${COMP_WORDS[0]},$COMP_CWORD" in
1022 __gitcomp "$(__git_remotes)"
1025 __gitcomp "$(__git_remotes)"
1031 case "${COMP_WORDS[0]}" in
1032 git-push) remote="${COMP_WORDS[1]}" ;;
1033 git) remote="${COMP_WORDS[2]}" ;;
1037 case "$COMP_WORDBREAKS" in
1039 *) pfx="${cur%%:*}:" ;;
1042 __gitcomp "$(__git_refs "$remote")" "$pfx" "${cur#*:}"
1045 __gitcomp "$(__git_refs)" + "${cur#+}"
1048 __gitcomp "$(__git_refs)"
1057 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
1058 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1059 __gitcomp "--continue --skip --abort"
1062 case "${COMP_WORDS[COMP_CWORD-1]}" in
1064 __gitcomp "$(__git_merge_strategies)"
1069 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
1073 __gitcomp "--onto --merge --strategy --interactive"
1076 __gitcomp "$(__git_refs)"
1081 local cur="${COMP_WORDS[COMP_CWORD]}"
1084 __gitcomp "--bcc --cc --cc-cmd --chain-reply-to --compose
1085 --dry-run --envelope-sender --from --identity
1086 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1087 --no-suppress-from --no-thread --quiet
1088 --signed-off-by-cc --smtp-pass --smtp-server
1089 --smtp-server-port --smtp-ssl --smtp-user --subject
1090 --suppress-cc --suppress-from --thread --to"
1099 local cur="${COMP_WORDS[COMP_CWORD]}"
1100 local prv="${COMP_WORDS[COMP_CWORD-1]}"
1103 __gitcomp "$(__git_remotes)"
1107 __gitcomp "$(__git_refs)"
1111 local remote="${prv#remote.}"
1112 remote="${remote%.fetch}"
1113 __gitcomp "$(__git_refs_remotes "$remote")"
1117 local remote="${prv#remote.}"
1118 remote="${remote%.push}"
1119 __gitcomp "$(git --git-dir="$(__gitdir)" \
1120 for-each-ref --format='%(refname):%(refname)' \
1124 pull.twohead|pull.octopus)
1125 __gitcomp "$(__git_merge_strategies)"
1128 color.branch|color.diff|color.status)
1129 __gitcomp "always never auto"
1134 black red green yellow blue magenta cyan white
1135 bold dim ul blink reverse
1147 --global --system --file=
1148 --list --replace-all
1149 --get --get-all --get-regexp
1150 --add --unset --unset-all
1151 --remove-section --rename-section
1156 local pfx="${cur%.*}."
1158 __gitcomp "remote merge" "$pfx" "$cur"
1162 local pfx="${cur%.*}."
1164 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1168 local pfx="${cur%.*}."
1171 url fetch push skipDefaultUpdate
1172 receivepack uploadpack tagopt
1177 local pfx="${cur%.*}."
1179 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1188 core.preferSymlinkRefs
1189 core.logAllRefUpdates
1190 core.loosecompression
1191 core.repositoryFormatVersion
1192 core.sharedRepository
1193 core.warnAmbiguousRefs
1195 core.packedGitWindowSize
1199 color.branch.current
1210 color.diff.whitespace
1215 color.status.changed
1216 color.status.untracked
1221 format.subjectprefix
1225 gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dbpass
1226 gitcvs.dbtablenameprefix
1229 gc.reflogexpireunreachable
1242 i18n.logOutputEncoding
1252 pack.deltaCacheLimit
1255 repack.useDeltaBaseOffset
1258 transfer.unpackLimit
1260 receive.denyNonFastForwards
1270 local subcommands="add rm show prune update"
1271 local subcommand="$(__git_find_subcommand "$subcommands")"
1272 if [ -z "$subcommand" ]; then
1273 __gitcomp "$subcommands"
1277 case "$subcommand" in
1279 __gitcomp "$(__git_remotes)"
1282 local i c='' IFS=$'\n'
1283 for i in $(git --git-dir="$(__gitdir)" config --list); do
1301 __git_has_doubledash && return
1303 local cur="${COMP_WORDS[COMP_CWORD]}"
1306 __gitcomp "--mixed --hard --soft"
1310 __gitcomp "$(__git_refs)"
1315 local cur="${COMP_WORDS[COMP_CWORD]}"
1318 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
1327 __git_has_doubledash && return
1329 local cur="${COMP_WORDS[COMP_CWORD]}"
1332 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1341 __git_has_doubledash && return
1343 local cur="${COMP_WORDS[COMP_CWORD]}"
1347 --max-count= --max-age= --since= --after=
1348 --min-age= --before= --until=
1350 --author= --committer= --grep=
1353 --numbered --summary
1358 __git_complete_revlist
1363 local cur="${COMP_WORDS[COMP_CWORD]}"
1367 oneline short medium full fuller email raw
1368 " "" "${cur##--pretty=}"
1372 __gitcomp "--pretty="
1381 local cur="${COMP_WORDS[COMP_CWORD]}"
1385 --all --remotes --topo-order --current --more=
1386 --list --independent --merge-base --no-name
1387 --sha1-name --topics --reflog
1392 __git_complete_revlist
1397 local subcommands='save list show apply clear drop pop create branch'
1398 local subcommand="$(__git_find_subcommand "$subcommands")"
1399 if [ -z "$subcommand" ]; then
1400 __gitcomp "$subcommands"
1402 local cur="${COMP_WORDS[COMP_CWORD]}"
1403 case "$subcommand,$cur" in
1405 __gitcomp "--keep-index"
1410 show,--*|apply,--*|drop,--*|pop,--*|branch,--*)
1413 show,*|apply,*|drop,*|pop,*|branch,*)
1414 __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
1415 | sed -n -e 's/:.*//p')"
1426 __git_has_doubledash && return
1428 local subcommands="add status init update"
1429 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1430 local cur="${COMP_WORDS[COMP_CWORD]}"
1433 __gitcomp "--quiet --cached"
1436 __gitcomp "$subcommands"
1446 init fetch clone rebase dcommit log find-rev
1447 set-tree commit-diff info create-ignore propget
1448 proplist show-ignore show-externals
1450 local subcommand="$(__git_find_subcommand "$subcommands")"
1451 if [ -z "$subcommand" ]; then
1452 __gitcomp "$subcommands"
1454 local remote_opts="--username= --config-dir= --no-auth-cache"
1456 --follow-parent --authors-file= --repack=
1457 --no-metadata --use-svm-props --use-svnsync-props
1458 --log-window-size= --no-checkout --quiet
1459 --repack-flags --user-log-author $remote_opts
1462 --template= --shared= --trunk= --tags=
1463 --branches= --stdlayout --minimize-url
1464 --no-metadata --use-svm-props --use-svnsync-props
1465 --rewrite-root= $remote_opts
1468 --edit --rmdir --find-copies-harder --copy-similarity=
1471 local cur="${COMP_WORDS[COMP_CWORD]}"
1472 case "$subcommand,$cur" in
1474 __gitcomp "--revision= --fetch-all $fc_opts"
1477 __gitcomp "--revision= $fc_opts $init_opts"
1480 __gitcomp "$init_opts"
1484 --merge --strategy= --verbose --dry-run
1485 --fetch-all --no-rebase $cmt_opts $fc_opts
1489 __gitcomp "--stdin $cmt_opts $fc_opts"
1491 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1493 __gitcomp "--revision="
1497 --limit= --revision= --verbose --incremental
1498 --oneline --show-commit --non-recursive
1504 --merge --verbose --strategy= --local
1505 --fetch-all $fc_opts
1509 __gitcomp "--message= --file= --revision= $cmt_opts"
1524 while [ $c -lt $COMP_CWORD ]; do
1525 i="${COMP_WORDS[c]}"
1528 __gitcomp "$(__git_tags)"
1538 case "${COMP_WORDS[COMP_CWORD-1]}" in
1544 __gitcomp "$(__git_tags)"
1550 __gitcomp "$(__git_refs)"
1557 local i c=1 command __git_dir
1559 while [ $c -lt $COMP_CWORD ]; do
1560 i="${COMP_WORDS[c]}"
1562 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1563 --bare) __git_dir="." ;;
1564 --version|-p|--paginate) ;;
1565 --help) command="help"; break ;;
1566 *) command="$i"; break ;;
1571 if [ -z "$command" ]; then
1572 case "${COMP_WORDS[COMP_CWORD]}" in
1573 --*=*) COMPREPLY=() ;;
1585 *) __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
1590 local expansion=$(__git_aliased_command "$command")
1591 [ "$expansion" ] && command="$expansion"
1596 apply) _git_apply ;;
1597 archive) _git_archive ;;
1598 bisect) _git_bisect ;;
1599 bundle) _git_bundle ;;
1600 branch) _git_branch ;;
1601 checkout) _git_checkout ;;
1602 cherry) _git_cherry ;;
1603 cherry-pick) _git_cherry_pick ;;
1604 clean) _git_clean ;;
1605 clone) _git_clone ;;
1606 commit) _git_commit ;;
1607 config) _git_config ;;
1608 describe) _git_describe ;;
1610 fetch) _git_fetch ;;
1611 format-patch) _git_format_patch ;;
1617 ls-remote) _git_ls_remote ;;
1618 ls-tree) _git_ls_tree ;;
1620 merge-base) _git_merge_base ;;
1621 name-rev) _git_name_rev ;;
1624 rebase) _git_rebase ;;
1625 remote) _git_remote ;;
1626 reset) _git_reset ;;
1627 revert) _git_revert ;;
1629 send-email) _git_send_email ;;
1630 shortlog) _git_shortlog ;;
1632 show-branch) _git_show_branch ;;
1633 stash) _git_stash ;;
1634 submodule) _git_submodule ;;
1637 whatchanged) _git_log ;;
1644 __git_has_doubledash && return
1646 local cur="${COMP_WORDS[COMP_CWORD]}"
1647 local g="$(git rev-parse --git-dir 2>/dev/null)"
1649 if [ -f $g/MERGE_HEAD ]; then
1654 __gitcomp "--not --all $merge"
1658 __git_complete_revlist
1661 complete -o default -o nospace -F _git git
1662 complete -o default -o nospace -F _gitk gitk
1664 # The following are necessary only for Cygwin, and only are needed
1665 # when the user has tab-completed the executable name and consequently
1666 # included the '.exe' suffix.
1668 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1669 complete -o default -o nospace -F _git git.exe