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]}"
677 __gitcomp
"--dry-run --quiet"
686 local cur
="${COMP_WORDS[COMP_CWORD]}"
711 __git_has_doubledash
&& return
713 local cur
="${COMP_WORDS[COMP_CWORD]}"
717 --all --author= --signoff --verify --no-verify
718 --edit --amend --include --only
727 local cur
="${COMP_WORDS[COMP_CWORD]}"
731 --all --tags --contains --abbrev= --candidates=
732 --exact-match --debug --long --match --always
736 __gitcomp
"$(__git_refs)"
741 __git_has_doubledash
&& return
743 local cur
="${COMP_WORDS[COMP_CWORD]}"
746 __gitcomp
"--cached --stat --numstat --shortstat --summary
747 --patch-with-stat --name-only --name-status --color
748 --no-color --color-words --no-renames --check
749 --full-index --binary --abbrev --diff-filter
750 --find-copies-harder --pickaxe-all --pickaxe-regex
751 --text --ignore-space-at-eol --ignore-space-change
752 --ignore-all-space --exit-code --quiet --ext-diff
754 --no-prefix --src-prefix= --dst-prefix=
755 --base --ours --theirs
765 local cur
="${COMP_WORDS[COMP_CWORD]}"
767 case "${COMP_WORDS[0]},$COMP_CWORD" in
769 __gitcomp
"$(__git_remotes)"
772 __gitcomp
"$(__git_remotes)"
778 case "$COMP_WORDBREAKS" in
780 *) pfx
="${cur%%:*}:" ;;
782 __gitcomp
"$(__git_refs)" "$pfx" "${cur#*:}"
786 case "${COMP_WORDS[0]}" in
787 git-fetch
) remote
="${COMP_WORDS[1]}" ;;
788 git
) remote
="${COMP_WORDS[2]}" ;;
790 __gitcomp
"$(__git_refs2 "$remote")"
799 local cur
="${COMP_WORDS[COMP_CWORD]}"
803 --stdout --attach --thread
805 --numbered --start-number
810 --full-index --binary
813 --no-prefix --src-prefix= --dst-prefix=
818 __git_complete_revlist
823 local cur
="${COMP_WORDS[COMP_CWORD]}"
826 __gitcomp
"--prune --aggressive"
835 __git_has_doubledash
&& return
837 local cur
="${COMP_WORDS[COMP_CWORD]}"
842 --text --ignore-case --word-regexp --invert-match
844 --extended-regexp --basic-regexp --fixed-strings
845 --files-with-matches --name-only
846 --files-without-match
848 --and --or --not --all-match
858 local cur
="${COMP_WORDS[COMP_CWORD]}"
861 __gitcomp
"--all --info --man --web"
865 __gitcomp
"$(__git_all_commands)"
870 __gitcomp
"$(__git_remotes)"
880 __git_has_doubledash
&& return
882 local cur
="${COMP_WORDS[COMP_CWORD]}"
886 oneline short medium full fuller email raw
887 " "" "${cur##--pretty=}"
892 relative iso8601 rfc2822 short local default
893 " "" "${cur##--date=}"
898 --max-count= --max-age= --since= --after=
899 --min-age= --before= --until=
900 --root --topo-order --date-order --reverse
902 --abbrev-commit --abbrev=
903 --relative-date --date=
904 --author= --committer= --grep=
906 --pretty= --name-status --name-only --raw
908 --left-right --cherry-pick
910 --stat --numstat --shortstat
911 --decorate --diff-filter=
912 --color-words --walk-reflogs
913 --parents --children --full-history
918 __git_complete_revlist
923 local cur
="${COMP_WORDS[COMP_CWORD]}"
924 case "${COMP_WORDS[COMP_CWORD-1]}" in
926 __gitcomp
"$(__git_merge_strategies)"
931 __gitcomp
"$(__git_merge_strategies)" "" "${cur##--strategy=}"
936 --no-commit --no-stat --log --no-log --squash --strategy
940 __gitcomp
"$(__git_refs)"
945 __gitcomp
"$(__git_refs)"
950 __gitcomp
"--tags --all --stdin"
955 local cur
="${COMP_WORDS[COMP_CWORD]}"
957 case "${COMP_WORDS[0]},$COMP_CWORD" in
959 __gitcomp
"$(__git_remotes)"
962 __gitcomp
"$(__git_remotes)"
966 case "${COMP_WORDS[0]}" in
967 git-pull
) remote
="${COMP_WORDS[1]}" ;;
968 git
) remote
="${COMP_WORDS[2]}" ;;
970 __gitcomp
"$(__git_refs "$remote")"
977 local cur
="${COMP_WORDS[COMP_CWORD]}"
979 case "${COMP_WORDS[0]},$COMP_CWORD" in
981 __gitcomp
"$(__git_remotes)"
984 __gitcomp
"$(__git_remotes)"
990 case "${COMP_WORDS[0]}" in
991 git-push
) remote
="${COMP_WORDS[1]}" ;;
992 git
) remote
="${COMP_WORDS[2]}" ;;
996 case "$COMP_WORDBREAKS" in
998 *) pfx
="${cur%%:*}:" ;;
1001 __gitcomp
"$(__git_refs "$remote")" "$pfx" "${cur#*:}"
1004 __gitcomp
"$(__git_refs)" + "${cur#+}"
1007 __gitcomp
"$(__git_refs)"
1016 local cur
="${COMP_WORDS[COMP_CWORD]}" dir
="$(__gitdir)"
1017 if [ -d "$dir"/rebase-apply
] ||
[ -d "$dir"/rebase-merge
]; then
1018 __gitcomp
"--continue --skip --abort"
1021 case "${COMP_WORDS[COMP_CWORD-1]}" in
1023 __gitcomp
"$(__git_merge_strategies)"
1028 __gitcomp
"$(__git_merge_strategies)" "" "${cur##--strategy=}"
1032 __gitcomp
"--onto --merge --strategy --interactive"
1035 __gitcomp
"$(__git_refs)"
1040 local cur
="${COMP_WORDS[COMP_CWORD]}"
1043 __gitcomp
"--bcc --cc --cc-cmd --chain-reply-to --compose
1044 --dry-run --envelope-sender --from --identity
1045 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1046 --no-suppress-from --no-thread --quiet
1047 --signed-off-by-cc --smtp-pass --smtp-server
1048 --smtp-server-port --smtp-ssl --smtp-user --subject
1049 --suppress-cc --suppress-from --thread --to"
1058 local cur
="${COMP_WORDS[COMP_CWORD]}"
1059 local prv
="${COMP_WORDS[COMP_CWORD-1]}"
1062 __gitcomp
"$(__git_remotes)"
1066 __gitcomp
"$(__git_refs)"
1070 local remote
="${prv#remote.}"
1071 remote
="${remote%.fetch}"
1072 __gitcomp
"$(__git_refs_remotes "$remote")"
1076 local remote
="${prv#remote.}"
1077 remote
="${remote%.push}"
1078 __gitcomp
"$(git --git-dir="$
(__gitdir
)" \
1079 for-each-ref --format='%(refname):%(refname)' \
1083 pull.twohead|pull.octopus
)
1084 __gitcomp
"$(__git_merge_strategies)"
1087 color.branch|color.
diff|color.status
)
1088 __gitcomp
"always never auto"
1093 black red green yellow blue magenta cyan white
1094 bold dim ul blink reverse
1106 --global --system --file=
1107 --list --replace-all
1108 --get --get-all --get-regexp
1109 --add --unset --unset-all
1110 --remove-section --rename-section
1115 local pfx
="${cur%.*}."
1117 __gitcomp
"remote merge" "$pfx" "$cur"
1121 local pfx
="${cur%.*}."
1123 __gitcomp
"$(__git_heads)" "$pfx" "$cur" "."
1127 local pfx
="${cur%.*}."
1130 url fetch push skipDefaultUpdate
1131 receivepack uploadpack tagopt
1136 local pfx
="${cur%.*}."
1138 __gitcomp
"$(__git_remotes)" "$pfx" "$cur" "."
1147 core.preferSymlinkRefs
1148 core.logAllRefUpdates
1149 core.loosecompression
1150 core.repositoryFormatVersion
1151 core.sharedRepository
1152 core.warnAmbiguousRefs
1154 core.packedGitWindowSize
1158 color.branch.current
1169 color.diff.whitespace
1174 color.status.changed
1175 color.status.untracked
1180 format.subjectprefix
1184 gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dbpass
1185 gitcvs.dbtablenameprefix
1188 gc.reflogexpireunreachable
1201 i18n.logOutputEncoding
1211 pack.deltaCacheLimit
1214 repack.useDeltaBaseOffset
1217 transfer.unpackLimit
1219 receive.denyNonFastForwards
1229 local subcommands
="add rm show prune update"
1230 local subcommand
="$(__git_find_subcommand "$subcommands")"
1231 if [ -z "$subcommand" ]; then
1232 __gitcomp
"$subcommands"
1236 case "$subcommand" in
1238 __gitcomp
"$(__git_remotes)"
1241 local i c
='' IFS
=$
'\n'
1242 for i
in $
(git
--git-dir="$(__gitdir)" config
--list); do
1260 __git_has_doubledash
&& return
1262 local cur
="${COMP_WORDS[COMP_CWORD]}"
1265 __gitcomp
"--mixed --hard --soft"
1269 __gitcomp
"$(__git_refs)"
1274 __git_has_doubledash
&& return
1276 local cur
="${COMP_WORDS[COMP_CWORD]}"
1279 __gitcomp
"--cached --dry-run --ignore-unmatch --quiet"
1288 __git_has_doubledash
&& return
1290 local cur
="${COMP_WORDS[COMP_CWORD]}"
1294 --max-count= --max-age= --since= --after=
1295 --min-age= --before= --until=
1297 --author= --committer= --grep=
1300 --numbered --summary
1305 __git_complete_revlist
1310 local cur
="${COMP_WORDS[COMP_CWORD]}"
1314 oneline short medium full fuller email raw
1315 " "" "${cur##--pretty=}"
1319 __gitcomp
"--pretty="
1328 local cur
="${COMP_WORDS[COMP_CWORD]}"
1332 --all --remotes --topo-order --current --more=
1333 --list --independent --merge-base --no-name
1334 --sha1-name --topics --reflog
1339 __git_complete_revlist
1344 local subcommands
='save list show apply clear drop pop create'
1345 local subcommand
="$(__git_find_subcommand "$subcommands")"
1346 if [ -z "$subcommand" ]; then
1347 __gitcomp
"$subcommands"
1349 local cur
="${COMP_WORDS[COMP_CWORD]}"
1350 case "$subcommand,$cur" in
1352 __gitcomp
"--keep-index"
1363 __git_has_doubledash
&& return
1365 local subcommands
="add status init update"
1366 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1367 local cur
="${COMP_WORDS[COMP_CWORD]}"
1370 __gitcomp
"--quiet --cached"
1373 __gitcomp
"$subcommands"
1383 init fetch clone rebase dcommit log find-rev
1384 set-tree commit-diff info create-ignore propget
1385 proplist show-ignore show-externals
1387 local subcommand
="$(__git_find_subcommand "$subcommands")"
1388 if [ -z "$subcommand" ]; then
1389 __gitcomp
"$subcommands"
1391 local remote_opts
="--username= --config-dir= --no-auth-cache"
1393 --follow-parent --authors-file= --repack=
1394 --no-metadata --use-svm-props --use-svnsync-props
1395 --log-window-size= --no-checkout --quiet
1396 --repack-flags --user-log-author $remote_opts
1399 --template= --shared= --trunk= --tags=
1400 --branches= --stdlayout --minimize-url
1401 --no-metadata --use-svm-props --use-svnsync-props
1402 --rewrite-root= $remote_opts
1405 --edit --rmdir --find-copies-harder --copy-similarity=
1408 local cur
="${COMP_WORDS[COMP_CWORD]}"
1409 case "$subcommand,$cur" in
1411 __gitcomp
"--revision= --fetch-all $fc_opts"
1414 __gitcomp
"--revision= $fc_opts $init_opts"
1417 __gitcomp
"$init_opts"
1421 --merge --strategy= --verbose --dry-run
1422 --fetch-all --no-rebase $cmt_opts $fc_opts
1426 __gitcomp
"--stdin $cmt_opts $fc_opts"
1428 create-ignore
,--*|propget
,--*|proplist
,--*|show-ignore
,--*|\
1430 __gitcomp
"--revision="
1434 --limit= --revision= --verbose --incremental
1435 --oneline --show-commit --non-recursive
1441 --merge --verbose --strategy= --local
1442 --fetch-all $fc_opts
1446 __gitcomp
"--message= --file= --revision= $cmt_opts"
1461 while [ $c -lt $COMP_CWORD ]; do
1462 i
="${COMP_WORDS[c]}"
1465 __gitcomp
"$(__git_tags)"
1475 case "${COMP_WORDS[COMP_CWORD-1]}" in
1481 __gitcomp
"$(__git_tags)"
1487 __gitcomp
"$(__git_refs)"
1494 local i c
=1 command __git_dir
1496 while [ $c -lt $COMP_CWORD ]; do
1497 i
="${COMP_WORDS[c]}"
1499 --git-dir=*) __git_dir
="${i#--git-dir=}" ;;
1500 --bare) __git_dir
="." ;;
1501 --version|
-p|
--paginate) ;;
1502 --help) command="help"; break ;;
1503 *) command="$i"; break ;;
1508 if [ -z "$command" ]; then
1509 case "${COMP_WORDS[COMP_CWORD]}" in
1510 --*=*) COMPREPLY
=() ;;
1522 *) __gitcomp
"$(__git_porcelain_commands) $(__git_aliases)" ;;
1527 local expansion
=$
(__git_aliased_command
"$command")
1528 [ "$expansion" ] && command="$expansion"
1533 apply
) _git_apply
;;
1534 bisect
) _git_bisect
;;
1535 bundle
) _git_bundle
;;
1536 branch
) _git_branch
;;
1537 checkout
) _git_checkout
;;
1538 cherry
) _git_cherry
;;
1539 cherry-pick
) _git_cherry_pick
;;
1540 clean
) _git_clean
;;
1541 clone
) _git_clone
;;
1542 commit
) _git_commit
;;
1543 config
) _git_config
;;
1544 describe
) _git_describe
;;
1546 fetch
) _git_fetch
;;
1547 format-patch
) _git_format_patch
;;
1552 ls-remote
) _git_ls_remote
;;
1553 ls-tree
) _git_ls_tree
;;
1555 merge-base
) _git_merge_base
;;
1556 name-rev
) _git_name_rev
;;
1559 rebase
) _git_rebase
;;
1560 remote
) _git_remote
;;
1561 reset) _git_reset
;;
1563 send-email
) _git_send_email
;;
1564 shortlog
) _git_shortlog
;;
1566 show-branch
) _git_show_branch
;;
1567 stash
) _git_stash
;;
1568 submodule
) _git_submodule
;;
1571 whatchanged
) _git_log
;;
1578 __git_has_doubledash
&& return
1580 local cur
="${COMP_WORDS[COMP_CWORD]}"
1581 local g
="$(git rev-parse --git-dir 2>/dev/null)"
1583 if [ -f $g/MERGE_HEAD
]; then
1588 __gitcomp
"--not --all $merge"
1592 __git_complete_revlist
1595 complete
-o default
-o nospace
-F _git git
1596 complete
-o default
-o nospace
-F _gitk gitk
1598 # The following are necessary only for Cygwin, and only are needed
1599 # when the user has tab-completed the executable name and consequently
1600 # included the '.exe' suffix.
1602 if [ Cygwin
= "$(uname -o 2>/dev/null)" ]; then
1603 complete
-o default
-o nospace
-F _git git.exe