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 __git_has_doubledash && return
568 local subcommands="start bad good skip reset visualize replay log run"
569 local subcommand="$(__git_find_subcommand "$subcommands")"
570 if [ -z "$subcommand" ]; then
571 __gitcomp "$subcommands"
575 case "$subcommand" in
577 __gitcomp "$(__git_refs)"
587 local i c=1 only_local_ref="n" has_r="n"
589 while [ $c -lt $COMP_CWORD ]; do
592 -d|-m) only_local_ref="y" ;;
598 case "${COMP_WORDS[COMP_CWORD]}" in
599 --*=*) COMPREPLY=() ;;
602 --color --no-color --verbose --abbrev= --no-abbrev
603 --track --no-track --contains --merged --no-merged
607 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
608 __gitcomp "$(__git_heads)"
610 __gitcomp "$(__git_refs)"
618 local mycword="$COMP_CWORD"
619 case "${COMP_WORDS[0]}" in
621 local cmd="${COMP_WORDS[2]}"
622 mycword="$((mycword-1))"
625 local cmd="${COMP_WORDS[1]}"
630 __gitcomp "create list-heads verify unbundle"
638 __git_complete_revlist
647 __git_has_doubledash && return
649 __gitcomp "$(__git_refs)"
654 __gitcomp "$(__git_refs)"
659 local cur="${COMP_WORDS[COMP_CWORD]}"
662 __gitcomp "--edit --no-commit"
665 __gitcomp "$(__git_refs)"
672 __git_has_doubledash && return
674 local cur="${COMP_WORDS[COMP_CWORD]}"
678 --all --author= --signoff --verify --no-verify
679 --edit --amend --include --only
688 local cur="${COMP_WORDS[COMP_CWORD]}"
692 --all --tags --contains --abbrev= --candidates=
693 --exact-match --debug --long --match --always
697 __gitcomp "$(__git_refs)"
702 __git_has_doubledash && return
704 local cur="${COMP_WORDS[COMP_CWORD]}"
707 __gitcomp "--cached --stat --numstat --shortstat --summary
708 --patch-with-stat --name-only --name-status --color
709 --no-color --color-words --no-renames --check
710 --full-index --binary --abbrev --diff-filter
711 --find-copies-harder --pickaxe-all --pickaxe-regex
712 --text --ignore-space-at-eol --ignore-space-change
713 --ignore-all-space --exit-code --quiet --ext-diff
715 --no-prefix --src-prefix= --dst-prefix=
716 --base --ours --theirs
726 local cur="${COMP_WORDS[COMP_CWORD]}"
728 case "${COMP_WORDS[0]},$COMP_CWORD" in
730 __gitcomp "$(__git_remotes)"
733 __gitcomp "$(__git_remotes)"
739 case "$COMP_WORDBREAKS" in
741 *) pfx="${cur%%:*}:" ;;
743 __gitcomp "$(__git_refs)" "$pfx" "${cur#*:}"
747 case "${COMP_WORDS[0]}" in
748 git-fetch) remote="${COMP_WORDS[1]}" ;;
749 git) remote="${COMP_WORDS[2]}" ;;
751 __gitcomp "$(__git_refs2 "$remote")"
760 local cur="${COMP_WORDS[COMP_CWORD]}"
764 --stdout --attach --thread
766 --numbered --start-number
771 --full-index --binary
774 --no-prefix --src-prefix= --dst-prefix=
779 __git_complete_revlist
784 local cur="${COMP_WORDS[COMP_CWORD]}"
787 __gitcomp "--prune --aggressive"
796 local cur="${COMP_WORDS[COMP_CWORD]}"
799 __gitcomp "--all --info --man --web"
803 __gitcomp "$(__git_all_commands)"
808 __gitcomp "$(__git_remotes)"
818 __git_has_doubledash && return
820 local cur="${COMP_WORDS[COMP_CWORD]}"
824 oneline short medium full fuller email raw
825 " "" "${cur##--pretty=}"
830 relative iso8601 rfc2822 short local default
831 " "" "${cur##--date=}"
836 --max-count= --max-age= --since= --after=
837 --min-age= --before= --until=
838 --root --topo-order --date-order --reverse
840 --abbrev-commit --abbrev=
841 --relative-date --date=
842 --author= --committer= --grep=
844 --pretty= --name-status --name-only --raw
846 --left-right --cherry-pick
848 --stat --numstat --shortstat
849 --decorate --diff-filter=
850 --color-words --walk-reflogs
851 --parents --children --full-history
856 __git_complete_revlist
861 local cur="${COMP_WORDS[COMP_CWORD]}"
862 case "${COMP_WORDS[COMP_CWORD-1]}" in
864 __gitcomp "$(__git_merge_strategies)"
869 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
874 --no-commit --no-stat --log --no-log --squash --strategy
878 __gitcomp "$(__git_refs)"
883 __gitcomp "$(__git_refs)"
888 __gitcomp "--tags --all --stdin"
893 local cur="${COMP_WORDS[COMP_CWORD]}"
895 case "${COMP_WORDS[0]},$COMP_CWORD" in
897 __gitcomp "$(__git_remotes)"
900 __gitcomp "$(__git_remotes)"
904 case "${COMP_WORDS[0]}" in
905 git-pull) remote="${COMP_WORDS[1]}" ;;
906 git) remote="${COMP_WORDS[2]}" ;;
908 __gitcomp "$(__git_refs "$remote")"
915 local cur="${COMP_WORDS[COMP_CWORD]}"
917 case "${COMP_WORDS[0]},$COMP_CWORD" in
919 __gitcomp "$(__git_remotes)"
922 __gitcomp "$(__git_remotes)"
928 case "${COMP_WORDS[0]}" in
929 git-push) remote="${COMP_WORDS[1]}" ;;
930 git) remote="${COMP_WORDS[2]}" ;;
934 case "$COMP_WORDBREAKS" in
936 *) pfx="${cur%%:*}:" ;;
939 __gitcomp "$(__git_refs "$remote")" "$pfx" "${cur#*:}"
942 __gitcomp "$(__git_refs)" + "${cur#+}"
945 __gitcomp "$(__git_refs)"
954 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
955 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
956 __gitcomp "--continue --skip --abort"
959 case "${COMP_WORDS[COMP_CWORD-1]}" in
961 __gitcomp "$(__git_merge_strategies)"
966 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
970 __gitcomp "--onto --merge --strategy --interactive"
973 __gitcomp "$(__git_refs)"
978 local cur="${COMP_WORDS[COMP_CWORD]}"
981 __gitcomp "--bcc --cc --cc-cmd --chain-reply-to --compose
982 --dry-run --envelope-sender --from --identity
983 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
984 --no-suppress-from --no-thread --quiet
985 --signed-off-by-cc --smtp-pass --smtp-server
986 --smtp-server-port --smtp-ssl --smtp-user --subject
987 --suppress-cc --suppress-from --thread --to"
996 local cur="${COMP_WORDS[COMP_CWORD]}"
997 local prv="${COMP_WORDS[COMP_CWORD-1]}"
1000 __gitcomp "$(__git_remotes)"
1004 __gitcomp "$(__git_refs)"
1008 local remote="${prv#remote.}"
1009 remote="${remote%.fetch}"
1010 __gitcomp "$(__git_refs_remotes "$remote")"
1014 local remote="${prv#remote.}"
1015 remote="${remote%.push}"
1016 __gitcomp "$(git --git-dir="$(__gitdir)" \
1017 for-each-ref --format='%(refname):%(refname)' \
1021 pull.twohead|pull.octopus)
1022 __gitcomp "$(__git_merge_strategies)"
1025 color.branch|color.diff|color.status)
1026 __gitcomp "always never auto"
1031 black red green yellow blue magenta cyan white
1032 bold dim ul blink reverse
1044 --global --system --file=
1045 --list --replace-all
1046 --get --get-all --get-regexp
1047 --add --unset --unset-all
1048 --remove-section --rename-section
1053 local pfx="${cur%.*}."
1055 __gitcomp "remote merge" "$pfx" "$cur"
1059 local pfx="${cur%.*}."
1061 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1065 local pfx="${cur%.*}."
1068 url fetch push skipDefaultUpdate
1069 receivepack uploadpack tagopt
1074 local pfx="${cur%.*}."
1076 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1085 core.preferSymlinkRefs
1086 core.logAllRefUpdates
1087 core.loosecompression
1088 core.repositoryFormatVersion
1089 core.sharedRepository
1090 core.warnAmbiguousRefs
1092 core.packedGitWindowSize
1096 color.branch.current
1107 color.diff.whitespace
1112 color.status.changed
1113 color.status.untracked
1118 format.subjectprefix
1122 gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dbpass
1123 gitcvs.dbtablenameprefix
1126 gc.reflogexpireunreachable
1139 i18n.logOutputEncoding
1149 pack.deltaCacheLimit
1152 repack.useDeltaBaseOffset
1155 transfer.unpackLimit
1157 receive.denyNonFastForwards
1167 local subcommands="add rm show prune update"
1168 local subcommand="$(__git_find_subcommand "$subcommands")"
1169 if [ -z "$subcommand" ]; then
1170 __gitcomp "$subcommands"
1174 case "$subcommand" in
1176 __gitcomp "$(__git_remotes)"
1179 local i c='' IFS=$'\n'
1180 for i in $(git --git-dir="$(__gitdir)" config --list); do
1198 __git_has_doubledash && return
1200 local cur="${COMP_WORDS[COMP_CWORD]}"
1203 __gitcomp "--mixed --hard --soft"
1207 __gitcomp "$(__git_refs)"
1212 __git_has_doubledash && return
1214 local cur="${COMP_WORDS[COMP_CWORD]}"
1217 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1226 __git_has_doubledash && return
1228 local cur="${COMP_WORDS[COMP_CWORD]}"
1232 --max-count= --max-age= --since= --after=
1233 --min-age= --before= --until=
1235 --author= --committer= --grep=
1238 --numbered --summary
1243 __git_complete_revlist
1248 local cur="${COMP_WORDS[COMP_CWORD]}"
1252 oneline short medium full fuller email raw
1253 " "" "${cur##--pretty=}"
1257 __gitcomp "--pretty="
1266 local cur="${COMP_WORDS[COMP_CWORD]}"
1270 --all --remotes --topo-order --current --more=
1271 --list --independent --merge-base --no-name
1272 --sha1-name --topics --reflog
1277 __git_complete_revlist
1282 local subcommands='save list show apply clear drop pop create'
1283 local subcommand="$(__git_find_subcommand "$subcommands")"
1284 if [ -z "$subcommand" ]; then
1285 __gitcomp "$subcommands"
1287 local cur="${COMP_WORDS[COMP_CWORD]}"
1288 case "$subcommand,$cur" in
1290 __gitcomp "--keep-index"
1301 __git_has_doubledash && return
1303 local subcommands="add status init update"
1304 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1305 local cur="${COMP_WORDS[COMP_CWORD]}"
1308 __gitcomp "--quiet --cached"
1311 __gitcomp "$subcommands"
1321 init fetch clone rebase dcommit log find-rev
1322 set-tree commit-diff info create-ignore propget
1323 proplist show-ignore show-externals
1325 local subcommand="$(__git_find_subcommand "$subcommands")"
1326 if [ -z "$subcommand" ]; then
1327 __gitcomp "$subcommands"
1329 local remote_opts="--username= --config-dir= --no-auth-cache"
1331 --follow-parent --authors-file= --repack=
1332 --no-metadata --use-svm-props --use-svnsync-props
1333 --log-window-size= --no-checkout --quiet
1334 --repack-flags --user-log-author $remote_opts
1337 --template= --shared= --trunk= --tags=
1338 --branches= --stdlayout --minimize-url
1339 --no-metadata --use-svm-props --use-svnsync-props
1340 --rewrite-root= $remote_opts
1343 --edit --rmdir --find-copies-harder --copy-similarity=
1346 local cur="${COMP_WORDS[COMP_CWORD]}"
1347 case "$subcommand,$cur" in
1349 __gitcomp "--revision= --fetch-all $fc_opts"
1352 __gitcomp "--revision= $fc_opts $init_opts"
1355 __gitcomp "$init_opts"
1359 --merge --strategy= --verbose --dry-run
1360 --fetch-all --no-rebase $cmt_opts $fc_opts
1364 __gitcomp "--stdin $cmt_opts $fc_opts"
1366 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1368 __gitcomp "--revision="
1372 --limit= --revision= --verbose --incremental
1373 --oneline --show-commit --non-recursive
1379 --merge --verbose --strategy= --local
1380 --fetch-all $fc_opts
1384 __gitcomp "--message= --file= --revision= $cmt_opts"
1399 while [ $c -lt $COMP_CWORD ]; do
1400 i="${COMP_WORDS[c]}"
1403 __gitcomp "$(__git_tags)"
1413 case "${COMP_WORDS[COMP_CWORD-1]}" in
1419 __gitcomp "$(__git_tags)"
1425 __gitcomp "$(__git_refs)"
1432 local i c=1 command __git_dir
1434 while [ $c -lt $COMP_CWORD ]; do
1435 i="${COMP_WORDS[c]}"
1437 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1438 --bare) __git_dir="." ;;
1439 --version|-p|--paginate) ;;
1440 --help) command="help"; break ;;
1441 *) command="$i"; break ;;
1446 if [ -z "$command" ]; then
1447 case "${COMP_WORDS[COMP_CWORD]}" in
1448 --*=*) COMPREPLY=() ;;
1460 *) __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
1465 local expansion=$(__git_aliased_command "$command")
1466 [ "$expansion" ] && command="$expansion"
1471 apply) _git_apply ;;
1472 bisect) _git_bisect ;;
1473 bundle) _git_bundle ;;
1474 branch) _git_branch ;;
1475 checkout) _git_checkout ;;
1476 cherry) _git_cherry ;;
1477 cherry-pick) _git_cherry_pick ;;
1478 commit) _git_commit ;;
1479 config) _git_config ;;
1480 describe) _git_describe ;;
1482 fetch) _git_fetch ;;
1483 format-patch) _git_format_patch ;;
1487 ls-remote) _git_ls_remote ;;
1488 ls-tree) _git_ls_tree ;;
1490 merge-base) _git_merge_base ;;
1491 name-rev) _git_name_rev ;;
1494 rebase) _git_rebase ;;
1495 remote) _git_remote ;;
1496 reset) _git_reset ;;
1498 send-email) _git_send_email ;;
1499 shortlog) _git_shortlog ;;
1501 show-branch) _git_show_branch ;;
1502 stash) _git_stash ;;
1503 submodule) _git_submodule ;;
1506 whatchanged) _git_log ;;
1513 __git_has_doubledash && return
1515 local cur="${COMP_WORDS[COMP_CWORD]}"
1516 local g="$(git rev-parse --git-dir 2>/dev/null)"
1518 if [ -f $g/MERGE_HEAD ]; then
1523 __gitcomp "--not --all $merge"
1527 __git_complete_revlist
1530 complete -o default -o nospace -F _git git
1531 complete -o default -o nospace -F _gitk gitk
1533 # The following are necessary only for Cygwin, and only are needed
1534 # when the user has tab-completed the executable name and consequently
1535 # included the '.exe' suffix.
1537 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1538 complete -o default -o nospace -F _git git.exe