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 __gitcomp "$(__git_refs)"
731 local cur="${COMP_WORDS[COMP_CWORD]}"
733 case "${COMP_WORDS[0]},$COMP_CWORD" in
735 __gitcomp "$(__git_remotes)"
738 __gitcomp "$(__git_remotes)"
744 case "$COMP_WORDBREAKS" in
746 *) pfx="${cur%%:*}:" ;;
748 __gitcomp "$(__git_refs)" "$pfx" "${cur#*:}"
752 case "${COMP_WORDS[0]}" in
753 git-fetch) remote="${COMP_WORDS[1]}" ;;
754 git) remote="${COMP_WORDS[2]}" ;;
756 __gitcomp "$(__git_refs2 "$remote")"
765 local cur="${COMP_WORDS[COMP_CWORD]}"
769 --stdout --attach --thread
771 --numbered --start-number
776 --full-index --binary
779 --no-prefix --src-prefix= --dst-prefix=
784 __git_complete_revlist
789 local cur="${COMP_WORDS[COMP_CWORD]}"
792 __gitcomp "--prune --aggressive"
801 local cur="${COMP_WORDS[COMP_CWORD]}"
804 __gitcomp "--all --info --man --web"
808 __gitcomp "$(__git_all_commands)"
813 __gitcomp "$(__git_remotes)"
823 __git_has_doubledash && return
825 local cur="${COMP_WORDS[COMP_CWORD]}"
829 oneline short medium full fuller email raw
830 " "" "${cur##--pretty=}"
835 relative iso8601 rfc2822 short local default
836 " "" "${cur##--date=}"
841 --max-count= --max-age= --since= --after=
842 --min-age= --before= --until=
843 --root --topo-order --date-order --reverse
845 --abbrev-commit --abbrev=
846 --relative-date --date=
847 --author= --committer= --grep=
849 --pretty= --name-status --name-only --raw
851 --left-right --cherry-pick
853 --stat --numstat --shortstat
854 --decorate --diff-filter=
855 --color-words --walk-reflogs
860 __git_complete_revlist
865 local cur="${COMP_WORDS[COMP_CWORD]}"
866 case "${COMP_WORDS[COMP_CWORD-1]}" in
868 __gitcomp "$(__git_merge_strategies)"
873 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
878 --no-commit --no-stat --log --no-log --squash --strategy
882 __gitcomp "$(__git_refs)"
887 __gitcomp "$(__git_refs)"
892 __gitcomp "--tags --all --stdin"
897 local cur="${COMP_WORDS[COMP_CWORD]}"
899 case "${COMP_WORDS[0]},$COMP_CWORD" in
901 __gitcomp "$(__git_remotes)"
904 __gitcomp "$(__git_remotes)"
908 case "${COMP_WORDS[0]}" in
909 git-pull) remote="${COMP_WORDS[1]}" ;;
910 git) remote="${COMP_WORDS[2]}" ;;
912 __gitcomp "$(__git_refs "$remote")"
919 local cur="${COMP_WORDS[COMP_CWORD]}"
921 case "${COMP_WORDS[0]},$COMP_CWORD" in
923 __gitcomp "$(__git_remotes)"
926 __gitcomp "$(__git_remotes)"
932 case "${COMP_WORDS[0]}" in
933 git-push) remote="${COMP_WORDS[1]}" ;;
934 git) remote="${COMP_WORDS[2]}" ;;
938 case "$COMP_WORDBREAKS" in
940 *) pfx="${cur%%:*}:" ;;
943 __gitcomp "$(__git_refs "$remote")" "$pfx" "${cur#*:}"
946 __gitcomp "$(__git_refs)" + "${cur#+}"
949 __gitcomp "$(__git_refs)"
958 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
959 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
960 __gitcomp "--continue --skip --abort"
963 case "${COMP_WORDS[COMP_CWORD-1]}" in
965 __gitcomp "$(__git_merge_strategies)"
970 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
974 __gitcomp "--onto --merge --strategy --interactive"
977 __gitcomp "$(__git_refs)"
982 local cur="${COMP_WORDS[COMP_CWORD]}"
985 __gitcomp "--bcc --cc --cc-cmd --chain-reply-to --compose
986 --dry-run --envelope-sender --from --identity
987 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
988 --no-suppress-from --no-thread --quiet
989 --signed-off-by-cc --smtp-pass --smtp-server
990 --smtp-server-port --smtp-ssl --smtp-user --subject
991 --suppress-cc --suppress-from --thread --to"
1000 local cur="${COMP_WORDS[COMP_CWORD]}"
1001 local prv="${COMP_WORDS[COMP_CWORD-1]}"
1004 __gitcomp "$(__git_remotes)"
1008 __gitcomp "$(__git_refs)"
1012 local remote="${prv#remote.}"
1013 remote="${remote%.fetch}"
1014 __gitcomp "$(__git_refs_remotes "$remote")"
1018 local remote="${prv#remote.}"
1019 remote="${remote%.push}"
1020 __gitcomp "$(git --git-dir="$(__gitdir)" \
1021 for-each-ref --format='%(refname):%(refname)' \
1025 pull.twohead|pull.octopus)
1026 __gitcomp "$(__git_merge_strategies)"
1029 color.branch|color.diff|color.status)
1030 __gitcomp "always never auto"
1035 black red green yellow blue magenta cyan white
1036 bold dim ul blink reverse
1048 --global --system --file=
1049 --list --replace-all
1050 --get --get-all --get-regexp
1051 --add --unset --unset-all
1052 --remove-section --rename-section
1057 local pfx="${cur%.*}."
1059 __gitcomp "remote merge" "$pfx" "$cur"
1063 local pfx="${cur%.*}."
1065 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1069 local pfx="${cur%.*}."
1072 url fetch push skipDefaultUpdate
1073 receivepack uploadpack tagopt
1078 local pfx="${cur%.*}."
1080 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1089 core.preferSymlinkRefs
1090 core.logAllRefUpdates
1091 core.loosecompression
1092 core.repositoryFormatVersion
1093 core.sharedRepository
1094 core.warnAmbiguousRefs
1096 core.packedGitWindowSize
1100 color.branch.current
1111 color.diff.whitespace
1116 color.status.changed
1117 color.status.untracked
1122 format.subjectprefix
1126 gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dbpass
1127 gitcvs.dbtablenameprefix
1130 gc.reflogexpireunreachable
1143 i18n.logOutputEncoding
1153 pack.deltaCacheLimit
1156 repack.useDeltaBaseOffset
1159 transfer.unpackLimit
1161 receive.denyNonFastForwards
1171 local subcommands="add rm show prune update"
1172 local subcommand="$(__git_find_subcommand "$subcommands")"
1173 if [ -z "$subcommand" ]; then
1174 __gitcomp "$subcommands"
1178 case "$subcommand" in
1180 __gitcomp "$(__git_remotes)"
1183 local i c='' IFS=$'\n'
1184 for i in $(git --git-dir="$(__gitdir)" config --list); do
1202 __git_has_doubledash && return
1204 local cur="${COMP_WORDS[COMP_CWORD]}"
1207 __gitcomp "--mixed --hard --soft"
1211 __gitcomp "$(__git_refs)"
1216 __git_has_doubledash && return
1218 local cur="${COMP_WORDS[COMP_CWORD]}"
1221 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1230 __git_has_doubledash && return
1232 local cur="${COMP_WORDS[COMP_CWORD]}"
1236 --max-count= --max-age= --since= --after=
1237 --min-age= --before= --until=
1239 --author= --committer= --grep=
1242 --numbered --summary
1247 __git_complete_revlist
1252 local cur="${COMP_WORDS[COMP_CWORD]}"
1256 oneline short medium full fuller email raw
1257 " "" "${cur##--pretty=}"
1261 __gitcomp "--pretty="
1270 local cur="${COMP_WORDS[COMP_CWORD]}"
1274 --all --remotes --topo-order --current --more=
1275 --list --independent --merge-base --no-name
1276 --sha1-name --topics --reflog
1281 __git_complete_revlist
1286 local subcommands='save list show apply clear drop pop create'
1287 local subcommand="$(__git_find_subcommand "$subcommands")"
1288 if [ -z "$subcommand" ]; then
1289 __gitcomp "$subcommands"
1291 local cur="${COMP_WORDS[COMP_CWORD]}"
1292 case "$subcommand,$cur" in
1294 __gitcomp "--keep-index"
1305 __git_has_doubledash && return
1307 local subcommands="add status init update"
1308 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1309 local cur="${COMP_WORDS[COMP_CWORD]}"
1312 __gitcomp "--quiet --cached"
1315 __gitcomp "$subcommands"
1325 init fetch clone rebase dcommit log find-rev
1326 set-tree commit-diff info create-ignore propget
1327 proplist show-ignore show-externals
1329 local subcommand="$(__git_find_subcommand "$subcommands")"
1330 if [ -z "$subcommand" ]; then
1331 __gitcomp "$subcommands"
1333 local remote_opts="--username= --config-dir= --no-auth-cache"
1335 --follow-parent --authors-file= --repack=
1336 --no-metadata --use-svm-props --use-svnsync-props
1337 --log-window-size= --no-checkout --quiet
1338 --repack-flags --user-log-author $remote_opts
1341 --template= --shared= --trunk= --tags=
1342 --branches= --stdlayout --minimize-url
1343 --no-metadata --use-svm-props --use-svnsync-props
1344 --rewrite-root= $remote_opts
1347 --edit --rmdir --find-copies-harder --copy-similarity=
1350 local cur="${COMP_WORDS[COMP_CWORD]}"
1351 case "$subcommand,$cur" in
1353 __gitcomp "--revision= --fetch-all $fc_opts"
1356 __gitcomp "--revision= $fc_opts $init_opts"
1359 __gitcomp "$init_opts"
1363 --merge --strategy= --verbose --dry-run
1364 --fetch-all --no-rebase $cmt_opts $fc_opts
1368 __gitcomp "--stdin $cmt_opts $fc_opts"
1370 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1372 __gitcomp "--revision="
1376 --limit= --revision= --verbose --incremental
1377 --oneline --show-commit --non-recursive
1383 --merge --verbose --strategy= --local
1384 --fetch-all $fc_opts
1388 __gitcomp "--message= --file= --revision= $cmt_opts"
1403 while [ $c -lt $COMP_CWORD ]; do
1404 i="${COMP_WORDS[c]}"
1407 __gitcomp "$(__git_tags)"
1417 case "${COMP_WORDS[COMP_CWORD-1]}" in
1423 __gitcomp "$(__git_tags)"
1429 __gitcomp "$(__git_refs)"
1436 local i c=1 command __git_dir
1438 while [ $c -lt $COMP_CWORD ]; do
1439 i="${COMP_WORDS[c]}"
1441 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1442 --bare) __git_dir="." ;;
1443 --version|-p|--paginate) ;;
1444 --help) command="help"; break ;;
1445 *) command="$i"; break ;;
1450 if [ -z "$command" ]; then
1451 case "${COMP_WORDS[COMP_CWORD]}" in
1452 --*=*) COMPREPLY=() ;;
1464 *) __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
1469 local expansion=$(__git_aliased_command "$command")
1470 [ "$expansion" ] && command="$expansion"
1475 apply) _git_apply ;;
1476 bisect) _git_bisect ;;
1477 bundle) _git_bundle ;;
1478 branch) _git_branch ;;
1479 checkout) _git_checkout ;;
1480 cherry) _git_cherry ;;
1481 cherry-pick) _git_cherry_pick ;;
1482 commit) _git_commit ;;
1483 config) _git_config ;;
1484 describe) _git_describe ;;
1486 fetch) _git_fetch ;;
1487 format-patch) _git_format_patch ;;
1491 ls-remote) _git_ls_remote ;;
1492 ls-tree) _git_ls_tree ;;
1494 merge-base) _git_merge_base ;;
1495 name-rev) _git_name_rev ;;
1498 rebase) _git_rebase ;;
1499 remote) _git_remote ;;
1500 reset) _git_reset ;;
1502 send-email) _git_send_email ;;
1503 shortlog) _git_shortlog ;;
1505 show-branch) _git_show_branch ;;
1506 stash) _git_stash ;;
1507 submodule) _git_submodule ;;
1510 whatchanged) _git_log ;;
1517 __git_has_doubledash && return
1519 local cur="${COMP_WORDS[COMP_CWORD]}"
1520 local g="$(git rev-parse --git-dir 2>/dev/null)"
1522 if [ -f $g/MERGE_HEAD ]; then
1527 __gitcomp "--not --all $merge"
1531 __git_complete_revlist
1534 complete -o default -o nospace -F _git git
1535 complete -o default -o nospace -F _gitk gitk
1537 # The following are necessary only for Cygwin, and only are needed
1538 # when the user has tab-completed the executable name and consequently
1539 # included the '.exe' suffix.
1541 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1542 complete -o default -o nospace -F _git git.exe