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 __gitcomp "$(__git_refs)"
469 __gitcomp "$(__git_refs)"
474 local cur="${COMP_WORDS[COMP_CWORD]}"
477 __gitcomp "--edit --no-commit"
480 __gitcomp "$(__git_refs)"
487 local cur="${COMP_WORDS[COMP_CWORD]}"
491 --all --author= --signoff --verify --no-verify
492 --edit --amend --include --only
506 __gitcomp "$(__git_refs)"
511 local cur="${COMP_WORDS[COMP_CWORD]}"
513 case "${COMP_WORDS[0]},$COMP_CWORD" in
515 __gitcomp "$(__git_remotes)"
518 __gitcomp "$(__git_remotes)"
523 __gitcomp "$(__git_refs)" "" "${cur#*:}"
527 case "${COMP_WORDS[0]}" in
528 git-fetch) remote="${COMP_WORDS[1]}" ;;
529 git) remote="${COMP_WORDS[2]}" ;;
531 __gitcomp "$(__git_refs2 "$remote")"
540 local cur="${COMP_WORDS[COMP_CWORD]}"
544 --stdout --attach --thread
546 --numbered --start-number
550 --full-index --binary
556 __git_complete_revlist
561 local cur="${COMP_WORDS[COMP_CWORD]}"
573 __gitcomp "$(__git_remotes)"
583 local cur="${COMP_WORDS[COMP_CWORD]}"
587 oneline short medium full fuller email raw
588 " "" "${cur##--pretty=}"
593 --max-count= --max-age= --since= --after=
594 --min-age= --before= --until=
595 --root --topo-order --date-order --reverse
597 --abbrev-commit --abbrev=
599 --author= --committer= --grep=
601 --pretty= --name-status --name-only --raw
607 __git_complete_revlist
612 local cur="${COMP_WORDS[COMP_CWORD]}"
613 case "${COMP_WORDS[COMP_CWORD-1]}" in
615 __gitcomp "$(__git_merge_strategies)"
620 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
625 --no-commit --no-summary --squash --strategy
629 __gitcomp "$(__git_refs)"
634 __gitcomp "$(__git_refs)"
639 __gitcomp "--tags --all --stdin"
644 local cur="${COMP_WORDS[COMP_CWORD]}"
646 case "${COMP_WORDS[0]},$COMP_CWORD" in
648 __gitcomp "$(__git_remotes)"
651 __gitcomp "$(__git_remotes)"
655 case "${COMP_WORDS[0]}" in
656 git-pull) remote="${COMP_WORDS[1]}" ;;
657 git) remote="${COMP_WORDS[2]}" ;;
659 __gitcomp "$(__git_refs "$remote")"
666 local cur="${COMP_WORDS[COMP_CWORD]}"
668 case "${COMP_WORDS[0]},$COMP_CWORD" in
670 __gitcomp "$(__git_remotes)"
673 __gitcomp "$(__git_remotes)"
679 case "${COMP_WORDS[0]}" in
680 git-push) remote="${COMP_WORDS[1]}" ;;
681 git) remote="${COMP_WORDS[2]}" ;;
683 __gitcomp "$(__git_refs "$remote")" "" "${cur#*:}"
686 __gitcomp "$(__git_refs)" + "${cur#+}"
689 __gitcomp "$(__git_refs)"
698 local cur="${COMP_WORDS[COMP_CWORD]}"
699 if [ -d .dotest ] || [ -d .git/.dotest-merge ]; then
700 __gitcomp "--continue --skip --abort"
703 case "${COMP_WORDS[COMP_CWORD-1]}" in
705 __gitcomp "$(__git_merge_strategies)"
710 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
714 __gitcomp "--onto --merge --strategy"
717 __gitcomp "$(__git_refs)"
722 local cur="${COMP_WORDS[COMP_CWORD]}"
723 local prv="${COMP_WORDS[COMP_CWORD-1]}"
726 __gitcomp "$(__git_remotes)"
730 __gitcomp "$(__git_refs)"
734 local remote="${prv#remote.}"
735 remote="${remote%.fetch}"
736 __gitcomp "$(__git_refs_remotes "$remote")"
740 local remote="${prv#remote.}"
741 remote="${remote%.push}"
742 __gitcomp "$(git --git-dir="$(__gitdir)" \
743 for-each-ref --format='%(refname):%(refname)' \
747 pull.twohead|pull.octopus)
748 __gitcomp "$(__git_merge_strategies)"
751 color.branch|color.diff|color.status)
752 __gitcomp "always never auto"
757 black red green yellow blue magenta cyan white
758 bold dim ul blink reverse
772 --get --get-all --get-regexp
773 --add --unset --unset-all
774 --remove-section --rename-section
779 local pfx="${cur%.*}."
781 __gitcomp "remote merge" "$pfx" "$cur"
785 local pfx="${cur%.*}."
787 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
791 local pfx="${cur%.*}."
794 url fetch push skipDefaultUpdate
795 receivepack uploadpack tagopt
800 local pfx="${cur%.*}."
802 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
811 core.preferSymlinkRefs
812 core.logAllRefUpdates
813 core.repositoryFormatVersion
814 core.sharedRepository
815 core.warnAmbiguousRefs
818 core.packedGitWindowSize
833 color.diff.whitespace
839 color.status.untracked
847 gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dvpass
850 gc.reflogexpireunreachable
863 i18n.logOutputEncoding
872 repack.useDeltaBaseOffset
878 receive.denyNonFastForwards
890 while [ $c -lt $COMP_CWORD ]; do
893 add|show|prune|update) command="$i"; break ;;
898 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
899 __gitcomp "add show prune update"
905 __gitcomp "$(__git_remotes)"
908 local i c='' IFS=$'\n'
909 for i in $(git --git-dir="$(__gitdir)" config --list); do
927 local cur="${COMP_WORDS[COMP_CWORD]}"
930 __gitcomp "--mixed --hard --soft"
934 __gitcomp "$(__git_refs)"
939 local cur="${COMP_WORDS[COMP_CWORD]}"
943 --max-count= --max-age= --since= --after=
944 --min-age= --before= --until=
946 --author= --committer= --grep=
954 __git_complete_revlist
959 local cur="${COMP_WORDS[COMP_CWORD]}"
963 oneline short medium full fuller email raw
964 " "" "${cur##--pretty=}"
968 __gitcomp "--pretty="
977 local i c=1 command __git_dir
979 while [ $c -lt $COMP_CWORD ]; do
982 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
983 --bare) __git_dir="." ;;
984 --version|--help|-p|--paginate) ;;
985 *) command="$i"; break ;;
990 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
991 case "${COMP_WORDS[COMP_CWORD]}" in
992 --*=*) COMPREPLY=() ;;
993 --*) __gitcomp "--git-dir= --bare --version --exec-path" ;;
994 *) __gitcomp "$(__git_commands) $(__git_aliases)" ;;
999 local expansion=$(__git_aliased_command "$command")
1000 [ "$expansion" ] && command="$expansion"
1005 apply) _git_apply ;;
1006 bisect) _git_bisect ;;
1007 branch) _git_branch ;;
1008 checkout) _git_checkout ;;
1009 cherry) _git_cherry ;;
1010 cherry-pick) _git_cherry_pick ;;
1011 commit) _git_commit ;;
1012 config) _git_config ;;
1014 fetch) _git_fetch ;;
1015 format-patch) _git_format_patch ;;
1018 ls-remote) _git_ls_remote ;;
1019 ls-tree) _git_ls_tree ;;
1021 merge-base) _git_merge_base ;;
1022 name-rev) _git_name_rev ;;
1025 rebase) _git_rebase ;;
1026 remote) _git_remote ;;
1027 reset) _git_reset ;;
1028 shortlog) _git_shortlog ;;
1030 show-branch) _git_log ;;
1031 whatchanged) _git_log ;;
1038 local cur="${COMP_WORDS[COMP_CWORD]}"
1041 __gitcomp "--not --all"
1045 __git_complete_revlist
1048 complete -o default -o nospace -F _git git
1049 complete -o default -o nospace -F _gitk gitk
1050 complete -o default -o nospace -F _git_am git-am
1051 complete -o default -o nospace -F _git_apply git-apply
1052 complete -o default -o nospace -F _git_bisect git-bisect
1053 complete -o default -o nospace -F _git_branch git-branch
1054 complete -o default -o nospace -F _git_checkout git-checkout
1055 complete -o default -o nospace -F _git_cherry git-cherry
1056 complete -o default -o nospace -F _git_cherry_pick git-cherry-pick
1057 complete -o default -o nospace -F _git_commit git-commit
1058 complete -o default -o nospace -F _git_diff git-diff
1059 complete -o default -o nospace -F _git_fetch git-fetch
1060 complete -o default -o nospace -F _git_format_patch git-format-patch
1061 complete -o default -o nospace -F _git_gc git-gc
1062 complete -o default -o nospace -F _git_log git-log
1063 complete -o default -o nospace -F _git_ls_remote git-ls-remote
1064 complete -o default -o nospace -F _git_ls_tree git-ls-tree
1065 complete -o default -o nospace -F _git_merge git-merge
1066 complete -o default -o nospace -F _git_merge_base git-merge-base
1067 complete -o default -o nospace -F _git_name_rev git-name-rev
1068 complete -o default -o nospace -F _git_pull git-pull
1069 complete -o default -o nospace -F _git_push git-push
1070 complete -o default -o nospace -F _git_rebase git-rebase
1071 complete -o default -o nospace -F _git_config git-config
1072 complete -o default -o nospace -F _git_remote git-remote
1073 complete -o default -o nospace -F _git_reset git-reset
1074 complete -o default -o nospace -F _git_shortlog git-shortlog
1075 complete -o default -o nospace -F _git_show git-show
1076 complete -o default -o nospace -F _git_log git-show-branch
1077 complete -o default -o nospace -F _git_log git-whatchanged
1079 # The following are necessary only for Cygwin, and only are needed
1080 # when the user has tab-completed the executable name and consequently
1081 # included the '.exe' suffix.
1083 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1084 complete -o default -o nospace -F _git_add git-add.exe
1085 complete -o default -o nospace -F _git_apply git-apply.exe
1086 complete -o default -o nospace -F _git git.exe
1087 complete -o default -o nospace -F _git_branch git-branch.exe
1088 complete -o default -o nospace -F _git_cherry git-cherry.exe
1089 complete -o default -o nospace -F _git_diff git-diff.exe
1090 complete -o default -o nospace -F _git_format_patch git-format-patch.exe
1091 complete -o default -o nospace -F _git_log git-log.exe
1092 complete -o default -o nospace -F _git_ls_tree git-ls-tree.exe
1093 complete -o default -o nospace -F _git_merge_base git-merge-base.exe
1094 complete -o default -o nospace -F _git_name_rev git-name-rev.exe
1095 complete -o default -o nospace -F _git_push git-push.exe
1096 complete -o default -o nospace -F _git_config git-config
1097 complete -o default -o nospace -F _git_shortlog git-shortlog.exe
1098 complete -o default -o nospace -F _git_show git-show.exe
1099 complete -o default -o nospace -F _git_log git-show-branch.exe
1100 complete -o default -o nospace -F _git_log git-whatchanged.exe