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"
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
535 __gitcomp "$(__git_refs)"
540 local cur="${COMP_WORDS[COMP_CWORD]}"
542 case "${COMP_WORDS[0]},$COMP_CWORD" in
544 __gitcomp "$(__git_remotes)"
547 __gitcomp "$(__git_remotes)"
552 __gitcomp "$(__git_refs)" "" "${cur#*:}"
556 case "${COMP_WORDS[0]}" in
557 git-fetch) remote="${COMP_WORDS[1]}" ;;
558 git) remote="${COMP_WORDS[2]}" ;;
560 __gitcomp "$(__git_refs2 "$remote")"
569 local cur="${COMP_WORDS[COMP_CWORD]}"
573 --stdout --attach --thread
575 --numbered --start-number
579 --full-index --binary
585 __git_complete_revlist
590 local cur="${COMP_WORDS[COMP_CWORD]}"
602 __gitcomp "$(__git_remotes)"
612 local cur="${COMP_WORDS[COMP_CWORD]}"
616 oneline short medium full fuller email raw
617 " "" "${cur##--pretty=}"
622 --max-count= --max-age= --since= --after=
623 --min-age= --before= --until=
624 --root --topo-order --date-order --reverse
626 --abbrev-commit --abbrev=
628 --author= --committer= --grep=
630 --pretty= --name-status --name-only --raw
636 __git_complete_revlist
641 local cur="${COMP_WORDS[COMP_CWORD]}"
642 case "${COMP_WORDS[COMP_CWORD-1]}" in
644 __gitcomp "$(__git_merge_strategies)"
649 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
654 --no-commit --no-summary --squash --strategy
658 __gitcomp "$(__git_refs)"
663 __gitcomp "$(__git_refs)"
668 __gitcomp "--tags --all --stdin"
673 local cur="${COMP_WORDS[COMP_CWORD]}"
675 case "${COMP_WORDS[0]},$COMP_CWORD" in
677 __gitcomp "$(__git_remotes)"
680 __gitcomp "$(__git_remotes)"
684 case "${COMP_WORDS[0]}" in
685 git-pull) remote="${COMP_WORDS[1]}" ;;
686 git) remote="${COMP_WORDS[2]}" ;;
688 __gitcomp "$(__git_refs "$remote")"
695 local cur="${COMP_WORDS[COMP_CWORD]}"
697 case "${COMP_WORDS[0]},$COMP_CWORD" in
699 __gitcomp "$(__git_remotes)"
702 __gitcomp "$(__git_remotes)"
708 case "${COMP_WORDS[0]}" in
709 git-push) remote="${COMP_WORDS[1]}" ;;
710 git) remote="${COMP_WORDS[2]}" ;;
712 __gitcomp "$(__git_refs "$remote")" "" "${cur#*:}"
715 __gitcomp "$(__git_refs)" + "${cur#+}"
718 __gitcomp "$(__git_refs)"
727 local cur="${COMP_WORDS[COMP_CWORD]}"
728 if [ -d .dotest ] || [ -d .git/.dotest-merge ]; then
729 __gitcomp "--continue --skip --abort"
732 case "${COMP_WORDS[COMP_CWORD-1]}" in
734 __gitcomp "$(__git_merge_strategies)"
739 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
743 __gitcomp "--onto --merge --strategy"
746 __gitcomp "$(__git_refs)"
751 local cur="${COMP_WORDS[COMP_CWORD]}"
752 local prv="${COMP_WORDS[COMP_CWORD-1]}"
755 __gitcomp "$(__git_remotes)"
759 __gitcomp "$(__git_refs)"
763 local remote="${prv#remote.}"
764 remote="${remote%.fetch}"
765 __gitcomp "$(__git_refs_remotes "$remote")"
769 local remote="${prv#remote.}"
770 remote="${remote%.push}"
771 __gitcomp "$(git --git-dir="$(__gitdir)" \
772 for-each-ref --format='%(refname):%(refname)' \
776 pull.twohead|pull.octopus)
777 __gitcomp "$(__git_merge_strategies)"
780 color.branch|color.diff|color.status)
781 __gitcomp "always never auto"
786 black red green yellow blue magenta cyan white
787 bold dim ul blink reverse
801 --get --get-all --get-regexp
802 --add --unset --unset-all
803 --remove-section --rename-section
808 local pfx="${cur%.*}."
810 __gitcomp "remote merge" "$pfx" "$cur"
814 local pfx="${cur%.*}."
816 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
820 local pfx="${cur%.*}."
823 url fetch push skipDefaultUpdate
824 receivepack uploadpack tagopt
829 local pfx="${cur%.*}."
831 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
840 core.preferSymlinkRefs
841 core.logAllRefUpdates
842 core.repositoryFormatVersion
843 core.sharedRepository
844 core.warnAmbiguousRefs
847 core.packedGitWindowSize
862 color.diff.whitespace
868 color.status.untracked
876 gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dvpass
879 gc.reflogexpireunreachable
892 i18n.logOutputEncoding
901 repack.useDeltaBaseOffset
907 receive.denyNonFastForwards
919 while [ $c -lt $COMP_CWORD ]; do
922 add|show|prune|update) command="$i"; break ;;
927 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
928 __gitcomp "add show prune update"
934 __gitcomp "$(__git_remotes)"
937 local i c='' IFS=$'\n'
938 for i in $(git --git-dir="$(__gitdir)" config --list); do
956 local cur="${COMP_WORDS[COMP_CWORD]}"
959 __gitcomp "--mixed --hard --soft"
963 __gitcomp "$(__git_refs)"
968 local cur="${COMP_WORDS[COMP_CWORD]}"
972 --max-count= --max-age= --since= --after=
973 --min-age= --before= --until=
975 --author= --committer= --grep=
983 __git_complete_revlist
988 local cur="${COMP_WORDS[COMP_CWORD]}"
992 oneline short medium full fuller email raw
993 " "" "${cur##--pretty=}"
997 __gitcomp "--pretty="
1006 __gitcomp 'list show apply clear'
1011 local i c=1 command __git_dir
1013 while [ $c -lt $COMP_CWORD ]; do
1014 i="${COMP_WORDS[c]}"
1016 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1017 --bare) __git_dir="." ;;
1018 --version|--help|-p|--paginate) ;;
1019 *) command="$i"; break ;;
1024 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
1025 case "${COMP_WORDS[COMP_CWORD]}" in
1026 --*=*) COMPREPLY=() ;;
1027 --*) __gitcomp "--git-dir= --bare --version --exec-path" ;;
1028 *) __gitcomp "$(__git_commands) $(__git_aliases)" ;;
1033 local expansion=$(__git_aliased_command "$command")
1034 [ "$expansion" ] && command="$expansion"
1039 apply) _git_apply ;;
1040 bisect) _git_bisect ;;
1041 bundle) _git_bundle ;;
1042 branch) _git_branch ;;
1043 checkout) _git_checkout ;;
1044 cherry) _git_cherry ;;
1045 cherry-pick) _git_cherry_pick ;;
1046 commit) _git_commit ;;
1047 config) _git_config ;;
1049 fetch) _git_fetch ;;
1050 format-patch) _git_format_patch ;;
1053 ls-remote) _git_ls_remote ;;
1054 ls-tree) _git_ls_tree ;;
1056 merge-base) _git_merge_base ;;
1057 name-rev) _git_name_rev ;;
1060 rebase) _git_rebase ;;
1061 remote) _git_remote ;;
1062 reset) _git_reset ;;
1063 shortlog) _git_shortlog ;;
1065 show-branch) _git_log ;;
1066 stash) _git_stash ;;
1067 whatchanged) _git_log ;;
1074 local cur="${COMP_WORDS[COMP_CWORD]}"
1077 __gitcomp "--not --all"
1081 __git_complete_revlist
1084 complete -o default -o nospace -F _git git
1085 complete -o default -o nospace -F _gitk gitk
1086 complete -o default -o nospace -F _git_am git-am
1087 complete -o default -o nospace -F _git_apply git-apply
1088 complete -o default -o nospace -F _git_bisect git-bisect
1089 complete -o default -o nospace -F _git_branch git-branch
1090 complete -o default -o nospace -F _git_bundle git-bundle
1091 complete -o default -o nospace -F _git_checkout git-checkout
1092 complete -o default -o nospace -F _git_cherry git-cherry
1093 complete -o default -o nospace -F _git_cherry_pick git-cherry-pick
1094 complete -o default -o nospace -F _git_commit git-commit
1095 complete -o default -o nospace -F _git_diff git-diff
1096 complete -o default -o nospace -F _git_fetch git-fetch
1097 complete -o default -o nospace -F _git_format_patch git-format-patch
1098 complete -o default -o nospace -F _git_gc git-gc
1099 complete -o default -o nospace -F _git_log git-log
1100 complete -o default -o nospace -F _git_ls_remote git-ls-remote
1101 complete -o default -o nospace -F _git_ls_tree git-ls-tree
1102 complete -o default -o nospace -F _git_merge git-merge
1103 complete -o default -o nospace -F _git_merge_base git-merge-base
1104 complete -o default -o nospace -F _git_name_rev git-name-rev
1105 complete -o default -o nospace -F _git_pull git-pull
1106 complete -o default -o nospace -F _git_push git-push
1107 complete -o default -o nospace -F _git_rebase git-rebase
1108 complete -o default -o nospace -F _git_config git-config
1109 complete -o default -o nospace -F _git_remote git-remote
1110 complete -o default -o nospace -F _git_reset git-reset
1111 complete -o default -o nospace -F _git_shortlog git-shortlog
1112 complete -o default -o nospace -F _git_show git-show
1113 complete -o default -o nospace -F _git_stash git-stash
1114 complete -o default -o nospace -F _git_log git-show-branch
1115 complete -o default -o nospace -F _git_log git-whatchanged
1117 # The following are necessary only for Cygwin, and only are needed
1118 # when the user has tab-completed the executable name and consequently
1119 # included the '.exe' suffix.
1121 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1122 complete -o default -o nospace -F _git_add git-add.exe
1123 complete -o default -o nospace -F _git_apply git-apply.exe
1124 complete -o default -o nospace -F _git git.exe
1125 complete -o default -o nospace -F _git_branch git-branch.exe
1126 complete -o default -o nospace -F _git_bundle git-bundle.exe
1127 complete -o default -o nospace -F _git_cherry git-cherry.exe
1128 complete -o default -o nospace -F _git_diff git-diff.exe
1129 complete -o default -o nospace -F _git_format_patch git-format-patch.exe
1130 complete -o default -o nospace -F _git_log git-log.exe
1131 complete -o default -o nospace -F _git_ls_tree git-ls-tree.exe
1132 complete -o default -o nospace -F _git_merge_base git-merge-base.exe
1133 complete -o default -o nospace -F _git_name_rev git-name-rev.exe
1134 complete -o default -o nospace -F _git_push git-push.exe
1135 complete -o default -o nospace -F _git_config git-config
1136 complete -o default -o nospace -F _git_shortlog git-shortlog.exe
1137 complete -o default -o nospace -F _git_show git-show.exe
1138 complete -o default -o nospace -F _git_log git-show-branch.exe
1139 complete -o default -o nospace -F _git_log git-whatchanged.exe