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 local cur="${COMP_WORDS[COMP_CWORD]}"
1014 __gitcomp "--dry-run"
1023 __gitcomp "--tags --all --stdin"
1028 local cur="${COMP_WORDS[COMP_CWORD]}"
1030 case "${COMP_WORDS[0]},$COMP_CWORD" in
1032 __gitcomp "$(__git_remotes)"
1035 __gitcomp "$(__git_remotes)"
1039 case "${COMP_WORDS[0]}" in
1040 git-pull) remote="${COMP_WORDS[1]}" ;;
1041 git) remote="${COMP_WORDS[2]}" ;;
1043 __gitcomp "$(__git_refs "$remote")"
1050 local cur="${COMP_WORDS[COMP_CWORD]}"
1052 case "${COMP_WORDS[0]},$COMP_CWORD" in
1054 __gitcomp "$(__git_remotes)"
1057 __gitcomp "$(__git_remotes)"
1063 case "${COMP_WORDS[0]}" in
1064 git-push) remote="${COMP_WORDS[1]}" ;;
1065 git) remote="${COMP_WORDS[2]}" ;;
1069 case "$COMP_WORDBREAKS" in
1071 *) pfx="${cur%%:*}:" ;;
1074 __gitcomp "$(__git_refs "$remote")" "$pfx" "${cur#*:}"
1077 __gitcomp "$(__git_refs)" + "${cur#+}"
1080 __gitcomp "$(__git_refs)"
1089 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
1090 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1091 __gitcomp "--continue --skip --abort"
1094 case "${COMP_WORDS[COMP_CWORD-1]}" in
1096 __gitcomp "$(__git_merge_strategies)"
1101 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
1105 __gitcomp "--onto --merge --strategy --interactive"
1108 __gitcomp "$(__git_refs)"
1113 local cur="${COMP_WORDS[COMP_CWORD]}"
1116 __gitcomp "--bcc --cc --cc-cmd --chain-reply-to --compose
1117 --dry-run --envelope-sender --from --identity
1118 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1119 --no-suppress-from --no-thread --quiet
1120 --signed-off-by-cc --smtp-pass --smtp-server
1121 --smtp-server-port --smtp-ssl --smtp-user --subject
1122 --suppress-cc --suppress-from --thread --to"
1131 local cur="${COMP_WORDS[COMP_CWORD]}"
1132 local prv="${COMP_WORDS[COMP_CWORD-1]}"
1135 __gitcomp "$(__git_remotes)"
1139 __gitcomp "$(__git_refs)"
1143 local remote="${prv#remote.}"
1144 remote="${remote%.fetch}"
1145 __gitcomp "$(__git_refs_remotes "$remote")"
1149 local remote="${prv#remote.}"
1150 remote="${remote%.push}"
1151 __gitcomp "$(git --git-dir="$(__gitdir)" \
1152 for-each-ref --format='%(refname):%(refname)' \
1156 pull.twohead|pull.octopus)
1157 __gitcomp "$(__git_merge_strategies)"
1160 color.branch|color.diff|color.status)
1161 __gitcomp "always never auto"
1166 black red green yellow blue magenta cyan white
1167 bold dim ul blink reverse
1179 --global --system --file=
1180 --list --replace-all
1181 --get --get-all --get-regexp
1182 --add --unset --unset-all
1183 --remove-section --rename-section
1188 local pfx="${cur%.*}."
1190 __gitcomp "remote merge" "$pfx" "$cur"
1194 local pfx="${cur%.*}."
1196 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1200 local pfx="${cur%.*}."
1203 url fetch push skipDefaultUpdate
1204 receivepack uploadpack tagopt
1209 local pfx="${cur%.*}."
1211 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1220 core.preferSymlinkRefs
1221 core.logAllRefUpdates
1222 core.loosecompression
1223 core.repositoryFormatVersion
1224 core.sharedRepository
1225 core.warnAmbiguousRefs
1227 core.packedGitWindowSize
1231 color.branch.current
1242 color.diff.whitespace
1247 color.status.changed
1248 color.status.untracked
1253 format.subjectprefix
1257 gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dbpass
1258 gitcvs.dbtablenameprefix
1261 gc.reflogexpireunreachable
1274 i18n.logOutputEncoding
1284 pack.deltaCacheLimit
1287 repack.useDeltaBaseOffset
1290 transfer.unpackLimit
1292 receive.denyNonFastForwards
1302 local subcommands="add rm show prune update"
1303 local subcommand="$(__git_find_subcommand "$subcommands")"
1304 if [ -z "$subcommand" ]; then
1305 __gitcomp "$subcommands"
1309 case "$subcommand" in
1311 __gitcomp "$(__git_remotes)"
1314 local i c='' IFS=$'\n'
1315 for i in $(git --git-dir="$(__gitdir)" config --list); do
1333 __git_has_doubledash && return
1335 local cur="${COMP_WORDS[COMP_CWORD]}"
1338 __gitcomp "--mixed --hard --soft"
1342 __gitcomp "$(__git_refs)"
1347 local cur="${COMP_WORDS[COMP_CWORD]}"
1350 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
1359 __git_has_doubledash && return
1361 local cur="${COMP_WORDS[COMP_CWORD]}"
1364 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1373 __git_has_doubledash && return
1375 local cur="${COMP_WORDS[COMP_CWORD]}"
1379 --max-count= --max-age= --since= --after=
1380 --min-age= --before= --until=
1382 --author= --committer= --grep=
1385 --numbered --summary
1390 __git_complete_revlist
1395 local cur="${COMP_WORDS[COMP_CWORD]}"
1399 oneline short medium full fuller email raw
1400 " "" "${cur##--pretty=}"
1404 __gitcomp "--pretty="
1413 local cur="${COMP_WORDS[COMP_CWORD]}"
1417 --all --remotes --topo-order --current --more=
1418 --list --independent --merge-base --no-name
1419 --sha1-name --topics --reflog
1424 __git_complete_revlist
1429 local subcommands='save list show apply clear drop pop create branch'
1430 local subcommand="$(__git_find_subcommand "$subcommands")"
1431 if [ -z "$subcommand" ]; then
1432 __gitcomp "$subcommands"
1434 local cur="${COMP_WORDS[COMP_CWORD]}"
1435 case "$subcommand,$cur" in
1437 __gitcomp "--keep-index"
1442 show,--*|drop,--*|pop,--*|branch,--*)
1445 show,*|apply,*|drop,*|pop,*|branch,*)
1446 __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
1447 | sed -n -e 's/:.*//p')"
1458 __git_has_doubledash && return
1460 local subcommands="add status init update"
1461 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1462 local cur="${COMP_WORDS[COMP_CWORD]}"
1465 __gitcomp "--quiet --cached"
1468 __gitcomp "$subcommands"
1478 init fetch clone rebase dcommit log find-rev
1479 set-tree commit-diff info create-ignore propget
1480 proplist show-ignore show-externals
1482 local subcommand="$(__git_find_subcommand "$subcommands")"
1483 if [ -z "$subcommand" ]; then
1484 __gitcomp "$subcommands"
1486 local remote_opts="--username= --config-dir= --no-auth-cache"
1488 --follow-parent --authors-file= --repack=
1489 --no-metadata --use-svm-props --use-svnsync-props
1490 --log-window-size= --no-checkout --quiet
1491 --repack-flags --user-log-author $remote_opts
1494 --template= --shared= --trunk= --tags=
1495 --branches= --stdlayout --minimize-url
1496 --no-metadata --use-svm-props --use-svnsync-props
1497 --rewrite-root= $remote_opts
1500 --edit --rmdir --find-copies-harder --copy-similarity=
1503 local cur="${COMP_WORDS[COMP_CWORD]}"
1504 case "$subcommand,$cur" in
1506 __gitcomp "--revision= --fetch-all $fc_opts"
1509 __gitcomp "--revision= $fc_opts $init_opts"
1512 __gitcomp "$init_opts"
1516 --merge --strategy= --verbose --dry-run
1517 --fetch-all --no-rebase $cmt_opts $fc_opts
1521 __gitcomp "--stdin $cmt_opts $fc_opts"
1523 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1525 __gitcomp "--revision="
1529 --limit= --revision= --verbose --incremental
1530 --oneline --show-commit --non-recursive
1536 --merge --verbose --strategy= --local
1537 --fetch-all $fc_opts
1541 __gitcomp "--message= --file= --revision= $cmt_opts"
1556 while [ $c -lt $COMP_CWORD ]; do
1557 i="${COMP_WORDS[c]}"
1560 __gitcomp "$(__git_tags)"
1570 case "${COMP_WORDS[COMP_CWORD-1]}" in
1576 __gitcomp "$(__git_tags)"
1582 __gitcomp "$(__git_refs)"
1589 local i c=1 command __git_dir
1591 while [ $c -lt $COMP_CWORD ]; do
1592 i="${COMP_WORDS[c]}"
1594 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1595 --bare) __git_dir="." ;;
1596 --version|-p|--paginate) ;;
1597 --help) command="help"; break ;;
1598 *) command="$i"; break ;;
1603 if [ -z "$command" ]; then
1604 case "${COMP_WORDS[COMP_CWORD]}" in
1605 --*=*) COMPREPLY=() ;;
1617 *) __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
1622 local expansion=$(__git_aliased_command "$command")
1623 [ "$expansion" ] && command="$expansion"
1628 apply) _git_apply ;;
1629 archive) _git_archive ;;
1630 bisect) _git_bisect ;;
1631 bundle) _git_bundle ;;
1632 branch) _git_branch ;;
1633 checkout) _git_checkout ;;
1634 cherry) _git_cherry ;;
1635 cherry-pick) _git_cherry_pick ;;
1636 clean) _git_clean ;;
1637 clone) _git_clone ;;
1638 commit) _git_commit ;;
1639 config) _git_config ;;
1640 describe) _git_describe ;;
1642 fetch) _git_fetch ;;
1643 format-patch) _git_format_patch ;;
1649 ls-files) _git_ls_files ;;
1650 ls-remote) _git_ls_remote ;;
1651 ls-tree) _git_ls_tree ;;
1653 merge-base) _git_merge_base ;;
1655 name-rev) _git_name_rev ;;
1658 rebase) _git_rebase ;;
1659 remote) _git_remote ;;
1660 reset) _git_reset ;;
1661 revert) _git_revert ;;
1663 send-email) _git_send_email ;;
1664 shortlog) _git_shortlog ;;
1666 show-branch) _git_show_branch ;;
1667 stash) _git_stash ;;
1668 submodule) _git_submodule ;;
1671 whatchanged) _git_log ;;
1678 __git_has_doubledash && return
1680 local cur="${COMP_WORDS[COMP_CWORD]}"
1681 local g="$(git rev-parse --git-dir 2>/dev/null)"
1683 if [ -f $g/MERGE_HEAD ]; then
1688 __gitcomp "--not --all $merge"
1692 __git_complete_revlist
1695 complete -o default -o nospace -F _git git
1696 complete -o default -o nospace -F _gitk gitk
1698 # The following are necessary only for Cygwin, and only are needed
1699 # when the user has tab-completed the executable name and consequently
1700 # included the '.exe' suffix.
1702 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1703 complete -o default -o nospace -F _git git.exe