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
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
580 --full-index --binary
586 __git_complete_revlist
591 local cur="${COMP_WORDS[COMP_CWORD]}"
594 __gitcomp "--prune --aggressive"
603 __gitcomp "$(__git_remotes)"
613 local cur="${COMP_WORDS[COMP_CWORD]}"
617 oneline short medium full fuller email raw
618 " "" "${cur##--pretty=}"
623 relative iso8601 rfc2822 short local default
624 " "" "${cur##--date=}"
629 --max-count= --max-age= --since= --after=
630 --min-age= --before= --until=
631 --root --topo-order --date-order --reverse
633 --abbrev-commit --abbrev=
634 --relative-date --date=
635 --author= --committer= --grep=
637 --pretty= --name-status --name-only --raw
643 __git_complete_revlist
648 local cur="${COMP_WORDS[COMP_CWORD]}"
649 case "${COMP_WORDS[COMP_CWORD-1]}" in
651 __gitcomp "$(__git_merge_strategies)"
656 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
661 --no-commit --no-summary --squash --strategy
665 __gitcomp "$(__git_refs)"
670 __gitcomp "$(__git_refs)"
675 __gitcomp "--tags --all --stdin"
680 local cur="${COMP_WORDS[COMP_CWORD]}"
682 case "${COMP_WORDS[0]},$COMP_CWORD" in
684 __gitcomp "$(__git_remotes)"
687 __gitcomp "$(__git_remotes)"
691 case "${COMP_WORDS[0]}" in
692 git-pull) remote="${COMP_WORDS[1]}" ;;
693 git) remote="${COMP_WORDS[2]}" ;;
695 __gitcomp "$(__git_refs "$remote")"
702 local cur="${COMP_WORDS[COMP_CWORD]}"
704 case "${COMP_WORDS[0]},$COMP_CWORD" in
706 __gitcomp "$(__git_remotes)"
709 __gitcomp "$(__git_remotes)"
715 case "${COMP_WORDS[0]}" in
716 git-push) remote="${COMP_WORDS[1]}" ;;
717 git) remote="${COMP_WORDS[2]}" ;;
719 __gitcomp "$(__git_refs "$remote")" "" "${cur#*:}"
722 __gitcomp "$(__git_refs)" + "${cur#+}"
725 __gitcomp "$(__git_refs)"
734 local cur="${COMP_WORDS[COMP_CWORD]}"
735 if [ -d .dotest ] || [ -d .git/.dotest-merge ]; then
736 __gitcomp "--continue --skip --abort"
739 case "${COMP_WORDS[COMP_CWORD-1]}" in
741 __gitcomp "$(__git_merge_strategies)"
746 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
750 __gitcomp "--onto --merge --strategy"
753 __gitcomp "$(__git_refs)"
758 local cur="${COMP_WORDS[COMP_CWORD]}"
759 local prv="${COMP_WORDS[COMP_CWORD-1]}"
762 __gitcomp "$(__git_remotes)"
766 __gitcomp "$(__git_refs)"
770 local remote="${prv#remote.}"
771 remote="${remote%.fetch}"
772 __gitcomp "$(__git_refs_remotes "$remote")"
776 local remote="${prv#remote.}"
777 remote="${remote%.push}"
778 __gitcomp "$(git --git-dir="$(__gitdir)" \
779 for-each-ref --format='%(refname):%(refname)' \
783 pull.twohead|pull.octopus)
784 __gitcomp "$(__git_merge_strategies)"
787 color.branch|color.diff|color.status)
788 __gitcomp "always never auto"
793 black red green yellow blue magenta cyan white
794 bold dim ul blink reverse
806 --global --system --file=
808 --get --get-all --get-regexp
809 --add --unset --unset-all
810 --remove-section --rename-section
815 local pfx="${cur%.*}."
817 __gitcomp "remote merge" "$pfx" "$cur"
821 local pfx="${cur%.*}."
823 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
827 local pfx="${cur%.*}."
830 url fetch push skipDefaultUpdate
831 receivepack uploadpack tagopt
836 local pfx="${cur%.*}."
838 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
847 core.preferSymlinkRefs
848 core.logAllRefUpdates
849 core.loosecompression
850 core.repositoryFormatVersion
851 core.sharedRepository
852 core.warnAmbiguousRefs
855 core.packedGitWindowSize
870 color.diff.whitespace
876 color.status.untracked
885 gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dvpass
888 gc.reflogexpireunreachable
901 i18n.logOutputEncoding
914 repack.useDeltaBaseOffset
920 receive.denyNonFastForwards
932 while [ $c -lt $COMP_CWORD ]; do
935 add|show|prune|update) command="$i"; break ;;
940 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
941 __gitcomp "add show prune update"
947 __gitcomp "$(__git_remotes)"
950 local i c='' IFS=$'\n'
951 for i in $(git --git-dir="$(__gitdir)" config --list); do
969 local cur="${COMP_WORDS[COMP_CWORD]}"
972 __gitcomp "--mixed --hard --soft"
976 __gitcomp "$(__git_refs)"
981 local cur="${COMP_WORDS[COMP_CWORD]}"
985 --max-count= --max-age= --since= --after=
986 --min-age= --before= --until=
988 --author= --committer= --grep=
996 __git_complete_revlist
1001 local cur="${COMP_WORDS[COMP_CWORD]}"
1005 oneline short medium full fuller email raw
1006 " "" "${cur##--pretty=}"
1010 __gitcomp "--pretty="
1019 __gitcomp 'list show apply clear'
1024 local i c=1 command __git_dir
1026 while [ $c -lt $COMP_CWORD ]; do
1027 i="${COMP_WORDS[c]}"
1029 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1030 --bare) __git_dir="." ;;
1031 --version|--help|-p|--paginate) ;;
1032 *) command="$i"; break ;;
1037 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
1038 case "${COMP_WORDS[COMP_CWORD]}" in
1039 --*=*) COMPREPLY=() ;;
1048 *) __gitcomp "$(__git_commands) $(__git_aliases)" ;;
1053 local expansion=$(__git_aliased_command "$command")
1054 [ "$expansion" ] && command="$expansion"
1059 apply) _git_apply ;;
1060 bisect) _git_bisect ;;
1061 bundle) _git_bundle ;;
1062 branch) _git_branch ;;
1063 checkout) _git_checkout ;;
1064 cherry) _git_cherry ;;
1065 cherry-pick) _git_cherry_pick ;;
1066 commit) _git_commit ;;
1067 config) _git_config ;;
1069 fetch) _git_fetch ;;
1070 format-patch) _git_format_patch ;;
1073 ls-remote) _git_ls_remote ;;
1074 ls-tree) _git_ls_tree ;;
1076 merge-base) _git_merge_base ;;
1077 name-rev) _git_name_rev ;;
1080 rebase) _git_rebase ;;
1081 remote) _git_remote ;;
1082 reset) _git_reset ;;
1083 shortlog) _git_shortlog ;;
1085 show-branch) _git_log ;;
1086 stash) _git_stash ;;
1087 whatchanged) _git_log ;;
1094 local cur="${COMP_WORDS[COMP_CWORD]}"
1097 __gitcomp "--not --all"
1101 __git_complete_revlist
1104 complete -o default -o nospace -F _git git
1105 complete -o default -o nospace -F _gitk gitk
1106 complete -o default -o nospace -F _git_am git-am
1107 complete -o default -o nospace -F _git_apply git-apply
1108 complete -o default -o nospace -F _git_bisect git-bisect
1109 complete -o default -o nospace -F _git_branch git-branch
1110 complete -o default -o nospace -F _git_bundle git-bundle
1111 complete -o default -o nospace -F _git_checkout git-checkout
1112 complete -o default -o nospace -F _git_cherry git-cherry
1113 complete -o default -o nospace -F _git_cherry_pick git-cherry-pick
1114 complete -o default -o nospace -F _git_commit git-commit
1115 complete -o default -o nospace -F _git_diff git-diff
1116 complete -o default -o nospace -F _git_fetch git-fetch
1117 complete -o default -o nospace -F _git_format_patch git-format-patch
1118 complete -o default -o nospace -F _git_gc git-gc
1119 complete -o default -o nospace -F _git_log git-log
1120 complete -o default -o nospace -F _git_ls_remote git-ls-remote
1121 complete -o default -o nospace -F _git_ls_tree git-ls-tree
1122 complete -o default -o nospace -F _git_merge git-merge
1123 complete -o default -o nospace -F _git_merge_base git-merge-base
1124 complete -o default -o nospace -F _git_name_rev git-name-rev
1125 complete -o default -o nospace -F _git_pull git-pull
1126 complete -o default -o nospace -F _git_push git-push
1127 complete -o default -o nospace -F _git_rebase git-rebase
1128 complete -o default -o nospace -F _git_config git-config
1129 complete -o default -o nospace -F _git_remote git-remote
1130 complete -o default -o nospace -F _git_reset git-reset
1131 complete -o default -o nospace -F _git_shortlog git-shortlog
1132 complete -o default -o nospace -F _git_show git-show
1133 complete -o default -o nospace -F _git_stash git-stash
1134 complete -o default -o nospace -F _git_log git-show-branch
1135 complete -o default -o nospace -F _git_log git-whatchanged
1137 # The following are necessary only for Cygwin, and only are needed
1138 # when the user has tab-completed the executable name and consequently
1139 # included the '.exe' suffix.
1141 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1142 complete -o default -o nospace -F _git_add git-add.exe
1143 complete -o default -o nospace -F _git_apply git-apply.exe
1144 complete -o default -o nospace -F _git git.exe
1145 complete -o default -o nospace -F _git_branch git-branch.exe
1146 complete -o default -o nospace -F _git_bundle git-bundle.exe
1147 complete -o default -o nospace -F _git_cherry git-cherry.exe
1148 complete -o default -o nospace -F _git_diff git-diff.exe
1149 complete -o default -o nospace -F _git_format_patch git-format-patch.exe
1150 complete -o default -o nospace -F _git_log git-log.exe
1151 complete -o default -o nospace -F _git_ls_tree git-ls-tree.exe
1152 complete -o default -o nospace -F _git_merge_base git-merge-base.exe
1153 complete -o default -o nospace -F _git_name_rev git-name-rev.exe
1154 complete -o default -o nospace -F _git_push git-push.exe
1155 complete -o default -o nospace -F _git_config git-config
1156 complete -o default -o nospace -F _git_shortlog git-shortlog.exe
1157 complete -o default -o nospace -F _git_show git-show.exe
1158 complete -o default -o nospace -F _git_log git-show-branch.exe
1159 complete -o default -o nospace -F _git_log git-whatchanged.exe