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:
51 if [ -n "$__git_dir" ]; then
53 elif [ -d .git ]; then
56 git rev-parse --git-dir 2>/dev/null
58 elif [ -d "$1/.git" ]; then
67 local b="$(git symbolic-ref HEAD 2>/dev/null)"
70 printf "$1" "${b##refs/heads/}"
72 printf " (%s)" "${b##refs/heads/}"
79 local all c s=$'\n' IFS=' '$'\t'$'\n'
80 local cur="${COMP_WORDS[COMP_CWORD]}"
86 --*=*) all="$all$c$4$s" ;;
87 *.) all="$all$c$4$s" ;;
88 *) all="$all$c$4 $s" ;;
92 COMPREPLY=($(compgen -P "$2" -W "$all" -- "$cur"))
98 local cmd i is_hash=y dir="$(__gitdir "$1")"
99 if [ -d "$dir" ]; then
100 for i in $(git --git-dir="$dir" \
101 for-each-ref --format='%(refname)' \
103 echo "${i#refs/heads/}"
107 for i in $(git-ls-remote "$1" 2>/dev/null); do
108 case "$is_hash,$i" in
111 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
112 n,*) is_hash=y; echo "$i" ;;
119 local cmd i is_hash=y dir="$(__gitdir "$1")"
120 if [ -d "$dir" ]; then
121 if [ -e "$dir/HEAD" ]; then echo HEAD; fi
122 for i in $(git --git-dir="$dir" \
123 for-each-ref --format='%(refname)' \
124 refs/tags refs/heads refs/remotes); do
126 refs/tags/*) echo "${i#refs/tags/}" ;;
127 refs/heads/*) echo "${i#refs/heads/}" ;;
128 refs/remotes/*) echo "${i#refs/remotes/}" ;;
134 for i in $(git-ls-remote "$dir" 2>/dev/null); do
135 case "$is_hash,$i" in
138 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
139 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
140 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
141 n,*) is_hash=y; echo "$i" ;;
149 for i in $(__git_refs "$1"); do
154 __git_refs_remotes ()
156 local cmd i is_hash=y
157 for i in $(git-ls-remote "$1" 2>/dev/null); do
158 case "$is_hash,$i" in
161 echo "$i:refs/remotes/$1/${i#refs/heads/}"
165 n,refs/tags/*) is_hash=y;;
173 local i ngoff IFS=$'\n' d="$(__gitdir)"
174 shopt -q nullglob || ngoff=1
176 for i in "$d/remotes"/*; do
177 echo ${i#$d/remotes/}
179 [ "$ngoff" ] && shopt -u nullglob
180 for i in $(git --git-dir="$d" config --list); do
190 __git_merge_strategies ()
192 if [ -n "$__git_merge_strategylist" ]; then
193 echo "$__git_merge_strategylist"
196 sed -n "/^all_strategies='/{
197 s/^all_strategies='//
201 }" "$(git --exec-path)/git-merge"
203 __git_merge_strategylist=
204 __git_merge_strategylist="$(__git_merge_strategies 2>/dev/null)"
206 __git_complete_file ()
208 local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
224 COMPREPLY=($(compgen -P "$pfx" \
225 -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
226 | sed '/^100... blob /s,^.* ,,
235 __gitcomp "$(__git_refs)"
240 __git_complete_revlist ()
242 local pfx cur="${COMP_WORDS[COMP_CWORD]}"
247 __gitcomp "$(__git_refs)" "$pfx" "$cur"
252 __gitcomp "$(__git_refs)" "$pfx" "$cur"
258 __gitcomp "$(__git_refs)"
265 if [ -n "$__git_commandlist" ]; then
266 echo "$__git_commandlist"
270 for i in $(git help -a|egrep '^ ')
273 add--interactive) : plumbing;;
274 applymbox) : ask gittus;;
275 applypatch) : ask gittus;;
276 archimport) : import;;
277 cat-file) : plumbing;;
278 check-attr) : plumbing;;
279 check-ref-format) : plumbing;;
280 commit-tree) : plumbing;;
281 convert-objects) : plumbing;;
282 cvsexportcommit) : export;;
283 cvsimport) : import;;
284 cvsserver) : daemon;;
286 diff-files) : plumbing;;
287 diff-index) : plumbing;;
288 diff-tree) : plumbing;;
289 fast-import) : import;;
290 fsck-objects) : plumbing;;
291 fetch--tool) : plumbing;;
292 fetch-pack) : plumbing;;
293 fmt-merge-msg) : plumbing;;
294 for-each-ref) : plumbing;;
295 hash-object) : plumbing;;
296 http-*) : transport;;
297 index-pack) : plumbing;;
298 init-db) : deprecated;;
299 local-fetch) : plumbing;;
300 mailinfo) : plumbing;;
301 mailsplit) : plumbing;;
302 merge-*) : plumbing;;
305 pack-objects) : plumbing;;
306 pack-redundant) : plumbing;;
307 pack-refs) : plumbing;;
308 parse-remote) : plumbing;;
309 patch-id) : plumbing;;
310 peek-remote) : plumbing;;
312 prune-packed) : plumbing;;
313 quiltimport) : import;;
314 read-tree) : plumbing;;
315 receive-pack) : plumbing;;
317 repo-config) : plumbing;;
319 rev-list) : plumbing;;
320 rev-parse) : plumbing;;
321 runstatus) : plumbing;;
322 sh-setup) : internal;;
324 send-pack) : plumbing;;
325 show-index) : plumbing;;
327 stripspace) : plumbing;;
328 svn) : import export;;
329 svnimport) : import;;
330 symbolic-ref) : plumbing;;
331 tar-tree) : deprecated;;
332 unpack-file) : plumbing;;
333 unpack-objects) : plumbing;;
334 update-index) : plumbing;;
335 update-ref) : plumbing;;
336 update-server-info) : daemon;;
337 upload-archive) : plumbing;;
338 upload-pack) : plumbing;;
339 write-tree) : plumbing;;
340 verify-tag) : plumbing;;
346 __git_commandlist="$(__git_commands 2>/dev/null)"
351 for i in $(git --git-dir="$(__gitdir)" config --list); do
361 __git_aliased_command ()
363 local word cmdline=$(git --git-dir="$(__gitdir)" \
364 config --get "alias.$1")
365 for word in $cmdline; do
366 if [ "${word##-*}" ]; then
373 __git_whitespacelist="nowarn warn error error-all strip"
377 local cur="${COMP_WORDS[COMP_CWORD]}"
378 if [ -d .dotest ]; then
379 __gitcomp "--skip --resolved"
384 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
389 --signoff --utf8 --binary --3way --interactive
399 local cur="${COMP_WORDS[COMP_CWORD]}"
402 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
407 --stat --numstat --summary --check --index
408 --cached --index-info --reverse --reject --unidiff-zero
409 --apply --no-add --exclude=
410 --whitespace= --inaccurate-eof --verbose
419 local cur="${COMP_WORDS[COMP_CWORD]}"
422 __gitcomp "--interactive --refresh"
431 while [ $c -lt $COMP_CWORD ]; do
434 start|bad|good|reset|visualize|replay|log)
442 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
443 __gitcomp "start bad good reset visualize replay log"
449 __gitcomp "$(__git_refs)"
459 __gitcomp "$(__git_refs)"
464 local mycword="$COMP_CWORD"
465 case "${COMP_WORDS[0]}" in
467 local cmd="${COMP_WORDS[2]}"
468 mycword="$((mycword-1))"
471 local cmd="${COMP_WORDS[1]}"
476 __gitcomp "create list-heads verify unbundle"
484 __git_complete_revlist
493 __gitcomp "$(__git_refs)"
498 __gitcomp "$(__git_refs)"
503 local cur="${COMP_WORDS[COMP_CWORD]}"
506 __gitcomp "--edit --no-commit"
509 __gitcomp "$(__git_refs)"
516 local cur="${COMP_WORDS[COMP_CWORD]}"
520 --all --author= --signoff --verify --no-verify
521 --edit --amend --include --only
530 __gitcomp "$(__git_refs)"
540 __gitcomp "$(__git_refs)"
545 local cur="${COMP_WORDS[COMP_CWORD]}"
547 case "${COMP_WORDS[0]},$COMP_CWORD" in
549 __gitcomp "$(__git_remotes)"
552 __gitcomp "$(__git_remotes)"
557 __gitcomp "$(__git_refs)" "" "${cur#*:}"
561 case "${COMP_WORDS[0]}" in
562 git-fetch) remote="${COMP_WORDS[1]}" ;;
563 git) remote="${COMP_WORDS[2]}" ;;
565 __gitcomp "$(__git_refs2 "$remote")"
574 local cur="${COMP_WORDS[COMP_CWORD]}"
578 --stdout --attach --thread
580 --numbered --start-number
585 --full-index --binary
591 __git_complete_revlist
596 local cur="${COMP_WORDS[COMP_CWORD]}"
599 __gitcomp "--prune --aggressive"
608 __gitcomp "$(__git_remotes)"
618 local cur="${COMP_WORDS[COMP_CWORD]}"
622 oneline short medium full fuller email raw
623 " "" "${cur##--pretty=}"
628 relative iso8601 rfc2822 short local default
629 " "" "${cur##--date=}"
634 --max-count= --max-age= --since= --after=
635 --min-age= --before= --until=
636 --root --topo-order --date-order --reverse
638 --abbrev-commit --abbrev=
639 --relative-date --date=
640 --author= --committer= --grep=
642 --pretty= --name-status --name-only --raw
644 --left-right --cherry-pick
649 __git_complete_revlist
654 local cur="${COMP_WORDS[COMP_CWORD]}"
655 case "${COMP_WORDS[COMP_CWORD-1]}" in
657 __gitcomp "$(__git_merge_strategies)"
662 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
667 --no-commit --no-summary --squash --strategy
671 __gitcomp "$(__git_refs)"
676 __gitcomp "$(__git_refs)"
681 __gitcomp "--tags --all --stdin"
686 local cur="${COMP_WORDS[COMP_CWORD]}"
688 case "${COMP_WORDS[0]},$COMP_CWORD" in
690 __gitcomp "$(__git_remotes)"
693 __gitcomp "$(__git_remotes)"
697 case "${COMP_WORDS[0]}" in
698 git-pull) remote="${COMP_WORDS[1]}" ;;
699 git) remote="${COMP_WORDS[2]}" ;;
701 __gitcomp "$(__git_refs "$remote")"
708 local cur="${COMP_WORDS[COMP_CWORD]}"
710 case "${COMP_WORDS[0]},$COMP_CWORD" in
712 __gitcomp "$(__git_remotes)"
715 __gitcomp "$(__git_remotes)"
721 case "${COMP_WORDS[0]}" in
722 git-push) remote="${COMP_WORDS[1]}" ;;
723 git) remote="${COMP_WORDS[2]}" ;;
725 __gitcomp "$(__git_refs "$remote")" "" "${cur#*:}"
728 __gitcomp "$(__git_refs)" + "${cur#+}"
731 __gitcomp "$(__git_refs)"
740 local cur="${COMP_WORDS[COMP_CWORD]}"
741 if [ -d .dotest ] || [ -d .git/.dotest-merge ]; then
742 __gitcomp "--continue --skip --abort"
745 case "${COMP_WORDS[COMP_CWORD-1]}" in
747 __gitcomp "$(__git_merge_strategies)"
752 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
756 __gitcomp "--onto --merge --strategy"
759 __gitcomp "$(__git_refs)"
764 local cur="${COMP_WORDS[COMP_CWORD]}"
765 local prv="${COMP_WORDS[COMP_CWORD-1]}"
768 __gitcomp "$(__git_remotes)"
772 __gitcomp "$(__git_refs)"
776 local remote="${prv#remote.}"
777 remote="${remote%.fetch}"
778 __gitcomp "$(__git_refs_remotes "$remote")"
782 local remote="${prv#remote.}"
783 remote="${remote%.push}"
784 __gitcomp "$(git --git-dir="$(__gitdir)" \
785 for-each-ref --format='%(refname):%(refname)' \
789 pull.twohead|pull.octopus)
790 __gitcomp "$(__git_merge_strategies)"
793 color.branch|color.diff|color.status)
794 __gitcomp "always never auto"
799 black red green yellow blue magenta cyan white
800 bold dim ul blink reverse
812 --global --system --file=
814 --get --get-all --get-regexp
815 --add --unset --unset-all
816 --remove-section --rename-section
821 local pfx="${cur%.*}."
823 __gitcomp "remote merge" "$pfx" "$cur"
827 local pfx="${cur%.*}."
829 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
833 local pfx="${cur%.*}."
836 url fetch push skipDefaultUpdate
837 receivepack uploadpack tagopt
842 local pfx="${cur%.*}."
844 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
853 core.preferSymlinkRefs
854 core.logAllRefUpdates
855 core.loosecompression
856 core.repositoryFormatVersion
857 core.sharedRepository
858 core.warnAmbiguousRefs
861 core.packedGitWindowSize
876 color.diff.whitespace
882 color.status.untracked
891 gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dvpass
894 gc.reflogexpireunreachable
907 i18n.logOutputEncoding
920 repack.useDeltaBaseOffset
926 receive.denyNonFastForwards
938 while [ $c -lt $COMP_CWORD ]; do
941 add|show|prune|update) command="$i"; break ;;
946 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
947 __gitcomp "add show prune update"
953 __gitcomp "$(__git_remotes)"
956 local i c='' IFS=$'\n'
957 for i in $(git --git-dir="$(__gitdir)" config --list); do
975 local cur="${COMP_WORDS[COMP_CWORD]}"
978 __gitcomp "--mixed --hard --soft"
982 __gitcomp "$(__git_refs)"
987 local cur="${COMP_WORDS[COMP_CWORD]}"
991 --max-count= --max-age= --since= --after=
992 --min-age= --before= --until=
994 --author= --committer= --grep=
1002 __git_complete_revlist
1007 local cur="${COMP_WORDS[COMP_CWORD]}"
1011 oneline short medium full fuller email raw
1012 " "" "${cur##--pretty=}"
1016 __gitcomp "--pretty="
1025 __gitcomp 'list show apply clear'
1031 while [ $c -lt $COMP_CWORD ]; do
1032 i="${COMP_WORDS[c]}"
1034 add|status|init|update) command="$i"; break ;;
1039 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
1040 local cur="${COMP_WORDS[COMP_CWORD]}"
1043 __gitcomp "--quiet --cached"
1046 __gitcomp "add status init update"
1055 local i c=1 command __git_dir
1057 while [ $c -lt $COMP_CWORD ]; do
1058 i="${COMP_WORDS[c]}"
1060 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1061 --bare) __git_dir="." ;;
1062 --version|--help|-p|--paginate) ;;
1063 *) command="$i"; break ;;
1068 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
1069 case "${COMP_WORDS[COMP_CWORD]}" in
1070 --*=*) COMPREPLY=() ;;
1079 *) __gitcomp "$(__git_commands) $(__git_aliases)" ;;
1084 local expansion=$(__git_aliased_command "$command")
1085 [ "$expansion" ] && command="$expansion"
1090 apply) _git_apply ;;
1091 bisect) _git_bisect ;;
1092 bundle) _git_bundle ;;
1093 branch) _git_branch ;;
1094 checkout) _git_checkout ;;
1095 cherry) _git_cherry ;;
1096 cherry-pick) _git_cherry_pick ;;
1097 commit) _git_commit ;;
1098 config) _git_config ;;
1099 describe) _git_describe ;;
1101 fetch) _git_fetch ;;
1102 format-patch) _git_format_patch ;;
1105 ls-remote) _git_ls_remote ;;
1106 ls-tree) _git_ls_tree ;;
1108 merge-base) _git_merge_base ;;
1109 name-rev) _git_name_rev ;;
1112 rebase) _git_rebase ;;
1113 remote) _git_remote ;;
1114 reset) _git_reset ;;
1115 shortlog) _git_shortlog ;;
1117 show-branch) _git_log ;;
1118 stash) _git_stash ;;
1119 submodule) _git_submodule ;;
1120 whatchanged) _git_log ;;
1127 local cur="${COMP_WORDS[COMP_CWORD]}"
1130 __gitcomp "--not --all"
1134 __git_complete_revlist
1137 complete -o default -o nospace -F _git git
1138 complete -o default -o nospace -F _gitk gitk
1139 complete -o default -o nospace -F _git_am git-am
1140 complete -o default -o nospace -F _git_apply git-apply
1141 complete -o default -o nospace -F _git_bisect git-bisect
1142 complete -o default -o nospace -F _git_branch git-branch
1143 complete -o default -o nospace -F _git_bundle git-bundle
1144 complete -o default -o nospace -F _git_checkout git-checkout
1145 complete -o default -o nospace -F _git_cherry git-cherry
1146 complete -o default -o nospace -F _git_cherry_pick git-cherry-pick
1147 complete -o default -o nospace -F _git_commit git-commit
1148 complete -o default -o nospace -F _git_describe git-describe
1149 complete -o default -o nospace -F _git_diff git-diff
1150 complete -o default -o nospace -F _git_fetch git-fetch
1151 complete -o default -o nospace -F _git_format_patch git-format-patch
1152 complete -o default -o nospace -F _git_gc git-gc
1153 complete -o default -o nospace -F _git_log git-log
1154 complete -o default -o nospace -F _git_ls_remote git-ls-remote
1155 complete -o default -o nospace -F _git_ls_tree git-ls-tree
1156 complete -o default -o nospace -F _git_merge git-merge
1157 complete -o default -o nospace -F _git_merge_base git-merge-base
1158 complete -o default -o nospace -F _git_name_rev git-name-rev
1159 complete -o default -o nospace -F _git_pull git-pull
1160 complete -o default -o nospace -F _git_push git-push
1161 complete -o default -o nospace -F _git_rebase git-rebase
1162 complete -o default -o nospace -F _git_config git-config
1163 complete -o default -o nospace -F _git_remote git-remote
1164 complete -o default -o nospace -F _git_reset git-reset
1165 complete -o default -o nospace -F _git_shortlog git-shortlog
1166 complete -o default -o nospace -F _git_show git-show
1167 complete -o default -o nospace -F _git_stash git-stash
1168 complete -o default -o nospace -F _git_submodule git-submodule
1169 complete -o default -o nospace -F _git_log git-show-branch
1170 complete -o default -o nospace -F _git_log git-whatchanged
1172 # The following are necessary only for Cygwin, and only are needed
1173 # when the user has tab-completed the executable name and consequently
1174 # included the '.exe' suffix.
1176 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1177 complete -o default -o nospace -F _git_add git-add.exe
1178 complete -o default -o nospace -F _git_apply git-apply.exe
1179 complete -o default -o nospace -F _git git.exe
1180 complete -o default -o nospace -F _git_branch git-branch.exe
1181 complete -o default -o nospace -F _git_bundle git-bundle.exe
1182 complete -o default -o nospace -F _git_cherry git-cherry.exe
1183 complete -o default -o nospace -F _git_describe git-describe.exe
1184 complete -o default -o nospace -F _git_diff git-diff.exe
1185 complete -o default -o nospace -F _git_format_patch git-format-patch.exe
1186 complete -o default -o nospace -F _git_log git-log.exe
1187 complete -o default -o nospace -F _git_ls_tree git-ls-tree.exe
1188 complete -o default -o nospace -F _git_merge_base git-merge-base.exe
1189 complete -o default -o nospace -F _git_name_rev git-name-rev.exe
1190 complete -o default -o nospace -F _git_push git-push.exe
1191 complete -o default -o nospace -F _git_config git-config
1192 complete -o default -o nospace -F _git_shortlog git-shortlog.exe
1193 complete -o default -o nospace -F _git_show git-show.exe
1194 complete -o default -o nospace -F _git_log git-show-branch.exe
1195 complete -o default -o nospace -F _git_log git-whatchanged.exe