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 for i in $(git --git-dir="$dir" \
122 for-each-ref --format='%(refname)' \
124 echo "${i#refs/tags/}"
128 for i in $(git-ls-remote "$1" 2>/dev/null); do
129 case "$is_hash,$i" in
132 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
133 n,*) is_hash=y; echo "$i" ;;
140 local cmd i is_hash=y dir="$(__gitdir "$1")"
141 if [ -d "$dir" ]; then
142 if [ -e "$dir/HEAD" ]; then echo HEAD; fi
143 for i in $(git --git-dir="$dir" \
144 for-each-ref --format='%(refname)' \
145 refs/tags refs/heads refs/remotes); do
147 refs/tags/*) echo "${i#refs/tags/}" ;;
148 refs/heads/*) echo "${i#refs/heads/}" ;;
149 refs/remotes/*) echo "${i#refs/remotes/}" ;;
155 for i in $(git-ls-remote "$dir" 2>/dev/null); do
156 case "$is_hash,$i" in
159 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
160 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
161 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
162 n,*) is_hash=y; echo "$i" ;;
170 for i in $(__git_refs "$1"); do
175 __git_refs_remotes ()
177 local cmd i is_hash=y
178 for i in $(git-ls-remote "$1" 2>/dev/null); do
179 case "$is_hash,$i" in
182 echo "$i:refs/remotes/$1/${i#refs/heads/}"
186 n,refs/tags/*) is_hash=y;;
194 local i ngoff IFS=$'\n' d="$(__gitdir)"
195 shopt -q nullglob || ngoff=1
197 for i in "$d/remotes"/*; do
198 echo ${i#$d/remotes/}
200 [ "$ngoff" ] && shopt -u nullglob
201 for i in $(git --git-dir="$d" config --list); do
211 __git_merge_strategies ()
213 if [ -n "$__git_merge_strategylist" ]; then
214 echo "$__git_merge_strategylist"
217 sed -n "/^all_strategies='/{
218 s/^all_strategies='//
222 }" "$(git --exec-path)/git-merge"
224 __git_merge_strategylist=
225 __git_merge_strategylist="$(__git_merge_strategies 2>/dev/null)"
227 __git_complete_file ()
229 local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
245 COMPREPLY=($(compgen -P "$pfx" \
246 -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
247 | sed '/^100... blob /s,^.* ,,
256 __gitcomp "$(__git_refs)"
261 __git_complete_revlist ()
263 local pfx cur="${COMP_WORDS[COMP_CWORD]}"
268 __gitcomp "$(__git_refs)" "$pfx" "$cur"
273 __gitcomp "$(__git_refs)" "$pfx" "$cur"
279 __gitcomp "$(__git_refs)"
286 if [ -n "$__git_commandlist" ]; then
287 echo "$__git_commandlist"
291 for i in $(git help -a|egrep '^ ')
294 add--interactive) : plumbing;;
295 applymbox) : ask gittus;;
296 applypatch) : ask gittus;;
297 archimport) : import;;
298 cat-file) : plumbing;;
299 check-attr) : plumbing;;
300 check-ref-format) : plumbing;;
301 commit-tree) : plumbing;;
302 cvsexportcommit) : export;;
303 cvsimport) : import;;
304 cvsserver) : daemon;;
306 diff-files) : plumbing;;
307 diff-index) : plumbing;;
308 diff-tree) : plumbing;;
309 fast-import) : import;;
310 fsck-objects) : plumbing;;
311 fetch--tool) : plumbing;;
312 fetch-pack) : plumbing;;
313 fmt-merge-msg) : plumbing;;
314 for-each-ref) : plumbing;;
315 hash-object) : plumbing;;
316 http-*) : transport;;
317 index-pack) : plumbing;;
318 init-db) : deprecated;;
319 local-fetch) : plumbing;;
320 mailinfo) : plumbing;;
321 mailsplit) : plumbing;;
322 merge-*) : plumbing;;
325 pack-objects) : plumbing;;
326 pack-redundant) : plumbing;;
327 pack-refs) : plumbing;;
328 parse-remote) : plumbing;;
329 patch-id) : plumbing;;
330 peek-remote) : plumbing;;
332 prune-packed) : plumbing;;
333 quiltimport) : import;;
334 read-tree) : plumbing;;
335 receive-pack) : plumbing;;
337 repo-config) : plumbing;;
339 rev-list) : plumbing;;
340 rev-parse) : plumbing;;
341 runstatus) : plumbing;;
342 sh-setup) : internal;;
344 send-pack) : plumbing;;
345 show-index) : plumbing;;
347 stripspace) : plumbing;;
348 svn) : import export;;
349 symbolic-ref) : plumbing;;
350 tar-tree) : deprecated;;
351 unpack-file) : plumbing;;
352 unpack-objects) : plumbing;;
353 update-index) : plumbing;;
354 update-ref) : plumbing;;
355 update-server-info) : daemon;;
356 upload-archive) : plumbing;;
357 upload-pack) : plumbing;;
358 write-tree) : plumbing;;
359 verify-tag) : plumbing;;
365 __git_commandlist="$(__git_commands 2>/dev/null)"
370 for i in $(git --git-dir="$(__gitdir)" config --list); do
380 __git_aliased_command ()
382 local word cmdline=$(git --git-dir="$(__gitdir)" \
383 config --get "alias.$1")
384 for word in $cmdline; do
385 if [ "${word##-*}" ]; then
392 __git_whitespacelist="nowarn warn error error-all strip"
396 local cur="${COMP_WORDS[COMP_CWORD]}"
397 if [ -d .dotest ]; then
398 __gitcomp "--skip --resolved"
403 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
408 --signoff --utf8 --binary --3way --interactive
418 local cur="${COMP_WORDS[COMP_CWORD]}"
421 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
426 --stat --numstat --summary --check --index
427 --cached --index-info --reverse --reject --unidiff-zero
428 --apply --no-add --exclude=
429 --whitespace= --inaccurate-eof --verbose
438 local cur="${COMP_WORDS[COMP_CWORD]}"
441 __gitcomp "--interactive --refresh"
450 while [ $c -lt $COMP_CWORD ]; do
453 start|bad|good|reset|visualize|replay|log)
461 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
462 __gitcomp "start bad good reset visualize replay log"
468 __gitcomp "$(__git_refs)"
478 __gitcomp "$(__git_refs)"
483 local mycword="$COMP_CWORD"
484 case "${COMP_WORDS[0]}" in
486 local cmd="${COMP_WORDS[2]}"
487 mycword="$((mycword-1))"
490 local cmd="${COMP_WORDS[1]}"
495 __gitcomp "create list-heads verify unbundle"
503 __git_complete_revlist
512 __gitcomp "$(__git_refs)"
517 __gitcomp "$(__git_refs)"
522 local cur="${COMP_WORDS[COMP_CWORD]}"
525 __gitcomp "--edit --no-commit"
528 __gitcomp "$(__git_refs)"
535 local cur="${COMP_WORDS[COMP_CWORD]}"
539 --all --author= --signoff --verify --no-verify
540 --edit --amend --include --only
549 __gitcomp "$(__git_refs)"
559 __gitcomp "$(__git_refs)"
564 local cur="${COMP_WORDS[COMP_CWORD]}"
566 case "${COMP_WORDS[0]},$COMP_CWORD" in
568 __gitcomp "$(__git_remotes)"
571 __gitcomp "$(__git_remotes)"
576 __gitcomp "$(__git_refs)" "" "${cur#*:}"
580 case "${COMP_WORDS[0]}" in
581 git-fetch) remote="${COMP_WORDS[1]}" ;;
582 git) remote="${COMP_WORDS[2]}" ;;
584 __gitcomp "$(__git_refs2 "$remote")"
593 local cur="${COMP_WORDS[COMP_CWORD]}"
597 --stdout --attach --thread
599 --numbered --start-number
604 --full-index --binary
610 __git_complete_revlist
615 local cur="${COMP_WORDS[COMP_CWORD]}"
618 __gitcomp "--prune --aggressive"
627 __gitcomp "$(__git_remotes)"
637 local cur="${COMP_WORDS[COMP_CWORD]}"
641 oneline short medium full fuller email raw
642 " "" "${cur##--pretty=}"
647 relative iso8601 rfc2822 short local default
648 " "" "${cur##--date=}"
653 --max-count= --max-age= --since= --after=
654 --min-age= --before= --until=
655 --root --topo-order --date-order --reverse
657 --abbrev-commit --abbrev=
658 --relative-date --date=
659 --author= --committer= --grep=
661 --pretty= --name-status --name-only --raw
663 --left-right --cherry-pick
668 __git_complete_revlist
673 local cur="${COMP_WORDS[COMP_CWORD]}"
674 case "${COMP_WORDS[COMP_CWORD-1]}" in
676 __gitcomp "$(__git_merge_strategies)"
681 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
686 --no-commit --no-summary --squash --strategy
690 __gitcomp "$(__git_refs)"
695 __gitcomp "$(__git_refs)"
700 __gitcomp "--tags --all --stdin"
705 local cur="${COMP_WORDS[COMP_CWORD]}"
707 case "${COMP_WORDS[0]},$COMP_CWORD" in
709 __gitcomp "$(__git_remotes)"
712 __gitcomp "$(__git_remotes)"
716 case "${COMP_WORDS[0]}" in
717 git-pull) remote="${COMP_WORDS[1]}" ;;
718 git) remote="${COMP_WORDS[2]}" ;;
720 __gitcomp "$(__git_refs "$remote")"
727 local cur="${COMP_WORDS[COMP_CWORD]}"
729 case "${COMP_WORDS[0]},$COMP_CWORD" in
731 __gitcomp "$(__git_remotes)"
734 __gitcomp "$(__git_remotes)"
740 case "${COMP_WORDS[0]}" in
741 git-push) remote="${COMP_WORDS[1]}" ;;
742 git) remote="${COMP_WORDS[2]}" ;;
744 __gitcomp "$(__git_refs "$remote")" "" "${cur#*:}"
747 __gitcomp "$(__git_refs)" + "${cur#+}"
750 __gitcomp "$(__git_refs)"
759 local cur="${COMP_WORDS[COMP_CWORD]}"
760 if [ -d .dotest ] || [ -d .git/.dotest-merge ]; then
761 __gitcomp "--continue --skip --abort"
764 case "${COMP_WORDS[COMP_CWORD-1]}" in
766 __gitcomp "$(__git_merge_strategies)"
771 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
775 __gitcomp "--onto --merge --strategy"
778 __gitcomp "$(__git_refs)"
783 local cur="${COMP_WORDS[COMP_CWORD]}"
784 local prv="${COMP_WORDS[COMP_CWORD-1]}"
787 __gitcomp "$(__git_remotes)"
791 __gitcomp "$(__git_refs)"
795 local remote="${prv#remote.}"
796 remote="${remote%.fetch}"
797 __gitcomp "$(__git_refs_remotes "$remote")"
801 local remote="${prv#remote.}"
802 remote="${remote%.push}"
803 __gitcomp "$(git --git-dir="$(__gitdir)" \
804 for-each-ref --format='%(refname):%(refname)' \
808 pull.twohead|pull.octopus)
809 __gitcomp "$(__git_merge_strategies)"
812 color.branch|color.diff|color.status)
813 __gitcomp "always never auto"
818 black red green yellow blue magenta cyan white
819 bold dim ul blink reverse
831 --global --system --file=
833 --get --get-all --get-regexp
834 --add --unset --unset-all
835 --remove-section --rename-section
840 local pfx="${cur%.*}."
842 __gitcomp "remote merge" "$pfx" "$cur"
846 local pfx="${cur%.*}."
848 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
852 local pfx="${cur%.*}."
855 url fetch push skipDefaultUpdate
856 receivepack uploadpack tagopt
861 local pfx="${cur%.*}."
863 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
872 core.preferSymlinkRefs
873 core.logAllRefUpdates
874 core.loosecompression
875 core.repositoryFormatVersion
876 core.sharedRepository
877 core.warnAmbiguousRefs
880 core.packedGitWindowSize
895 color.diff.whitespace
901 color.status.untracked
910 gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dvpass
913 gc.reflogexpireunreachable
926 i18n.logOutputEncoding
939 repack.useDeltaBaseOffset
945 receive.denyNonFastForwards
957 while [ $c -lt $COMP_CWORD ]; do
960 add|show|prune|update) command="$i"; break ;;
965 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
966 __gitcomp "add show prune update"
972 __gitcomp "$(__git_remotes)"
975 local i c='' IFS=$'\n'
976 for i in $(git --git-dir="$(__gitdir)" config --list); do
994 local cur="${COMP_WORDS[COMP_CWORD]}"
997 __gitcomp "--mixed --hard --soft"
1001 __gitcomp "$(__git_refs)"
1006 local cur="${COMP_WORDS[COMP_CWORD]}"
1010 --max-count= --max-age= --since= --after=
1011 --min-age= --before= --until=
1013 --author= --committer= --grep=
1016 --numbered --summary
1021 __git_complete_revlist
1026 local cur="${COMP_WORDS[COMP_CWORD]}"
1030 oneline short medium full fuller email raw
1031 " "" "${cur##--pretty=}"
1035 __gitcomp "--pretty="
1044 __gitcomp 'list show apply clear'
1050 while [ $c -lt $COMP_CWORD ]; do
1051 i="${COMP_WORDS[c]}"
1053 add|status|init|update) command="$i"; break ;;
1058 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
1059 local cur="${COMP_WORDS[COMP_CWORD]}"
1062 __gitcomp "--quiet --cached"
1065 __gitcomp "add status init update"
1075 while [ $c -lt $COMP_CWORD ]; do
1076 i="${COMP_WORDS[c]}"
1079 __gitcomp "$(__git_tags)"
1089 case "${COMP_WORDS[COMP_CWORD-1]}" in
1095 __gitcomp "$(__git_tags)"
1101 __gitcomp "$(__git_refs)"
1108 local i c=1 command __git_dir
1110 while [ $c -lt $COMP_CWORD ]; do
1111 i="${COMP_WORDS[c]}"
1113 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1114 --bare) __git_dir="." ;;
1115 --version|--help|-p|--paginate) ;;
1116 *) command="$i"; break ;;
1121 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
1122 case "${COMP_WORDS[COMP_CWORD]}" in
1123 --*=*) COMPREPLY=() ;;
1132 *) __gitcomp "$(__git_commands) $(__git_aliases)" ;;
1137 local expansion=$(__git_aliased_command "$command")
1138 [ "$expansion" ] && command="$expansion"
1143 apply) _git_apply ;;
1144 bisect) _git_bisect ;;
1145 bundle) _git_bundle ;;
1146 branch) _git_branch ;;
1147 checkout) _git_checkout ;;
1148 cherry) _git_cherry ;;
1149 cherry-pick) _git_cherry_pick ;;
1150 commit) _git_commit ;;
1151 config) _git_config ;;
1152 describe) _git_describe ;;
1154 fetch) _git_fetch ;;
1155 format-patch) _git_format_patch ;;
1158 ls-remote) _git_ls_remote ;;
1159 ls-tree) _git_ls_tree ;;
1161 merge-base) _git_merge_base ;;
1162 name-rev) _git_name_rev ;;
1165 rebase) _git_rebase ;;
1166 remote) _git_remote ;;
1167 reset) _git_reset ;;
1168 shortlog) _git_shortlog ;;
1170 show-branch) _git_log ;;
1171 stash) _git_stash ;;
1172 submodule) _git_submodule ;;
1174 whatchanged) _git_log ;;
1181 local cur="${COMP_WORDS[COMP_CWORD]}"
1184 __gitcomp "--not --all"
1188 __git_complete_revlist
1191 complete -o default -o nospace -F _git git
1192 complete -o default -o nospace -F _gitk gitk
1193 complete -o default -o nospace -F _git_am git-am
1194 complete -o default -o nospace -F _git_apply git-apply
1195 complete -o default -o nospace -F _git_bisect git-bisect
1196 complete -o default -o nospace -F _git_branch git-branch
1197 complete -o default -o nospace -F _git_bundle git-bundle
1198 complete -o default -o nospace -F _git_checkout git-checkout
1199 complete -o default -o nospace -F _git_cherry git-cherry
1200 complete -o default -o nospace -F _git_cherry_pick git-cherry-pick
1201 complete -o default -o nospace -F _git_commit git-commit
1202 complete -o default -o nospace -F _git_describe git-describe
1203 complete -o default -o nospace -F _git_diff git-diff
1204 complete -o default -o nospace -F _git_fetch git-fetch
1205 complete -o default -o nospace -F _git_format_patch git-format-patch
1206 complete -o default -o nospace -F _git_gc git-gc
1207 complete -o default -o nospace -F _git_log git-log
1208 complete -o default -o nospace -F _git_ls_remote git-ls-remote
1209 complete -o default -o nospace -F _git_ls_tree git-ls-tree
1210 complete -o default -o nospace -F _git_merge git-merge
1211 complete -o default -o nospace -F _git_merge_base git-merge-base
1212 complete -o default -o nospace -F _git_name_rev git-name-rev
1213 complete -o default -o nospace -F _git_pull git-pull
1214 complete -o default -o nospace -F _git_push git-push
1215 complete -o default -o nospace -F _git_rebase git-rebase
1216 complete -o default -o nospace -F _git_config git-config
1217 complete -o default -o nospace -F _git_remote git-remote
1218 complete -o default -o nospace -F _git_reset git-reset
1219 complete -o default -o nospace -F _git_shortlog git-shortlog
1220 complete -o default -o nospace -F _git_show git-show
1221 complete -o default -o nospace -F _git_stash git-stash
1222 complete -o default -o nospace -F _git_submodule git-submodule
1223 complete -o default -o nospace -F _git_log git-show-branch
1224 complete -o default -o nospace -F _git_tag git-tag
1225 complete -o default -o nospace -F _git_log git-whatchanged
1227 # The following are necessary only for Cygwin, and only are needed
1228 # when the user has tab-completed the executable name and consequently
1229 # included the '.exe' suffix.
1231 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1232 complete -o default -o nospace -F _git_add git-add.exe
1233 complete -o default -o nospace -F _git_apply git-apply.exe
1234 complete -o default -o nospace -F _git git.exe
1235 complete -o default -o nospace -F _git_branch git-branch.exe
1236 complete -o default -o nospace -F _git_bundle git-bundle.exe
1237 complete -o default -o nospace -F _git_cherry git-cherry.exe
1238 complete -o default -o nospace -F _git_describe git-describe.exe
1239 complete -o default -o nospace -F _git_diff git-diff.exe
1240 complete -o default -o nospace -F _git_format_patch git-format-patch.exe
1241 complete -o default -o nospace -F _git_log git-log.exe
1242 complete -o default -o nospace -F _git_ls_tree git-ls-tree.exe
1243 complete -o default -o nospace -F _git_merge_base git-merge-base.exe
1244 complete -o default -o nospace -F _git_name_rev git-name-rev.exe
1245 complete -o default -o nospace -F _git_push git-push.exe
1246 complete -o default -o nospace -F _git_config git-config
1247 complete -o default -o nospace -F _git_shortlog git-shortlog.exe
1248 complete -o default -o nospace -F _git_show git-show.exe
1249 complete -o default -o nospace -F _git_log git-show-branch.exe
1250 complete -o default -o nospace -F _git_tag git-tag.exe
1251 complete -o default -o nospace -F _git_log git-whatchanged.exe