1#
2# bash completion support for core Git.
3#
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.
7#
8# The contained completion routines provide support for completing:
9#
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
16#
17# To use these routines:
18#
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
22#
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.
28#
29# 4) Consider changing your PS1 to also show the current branch:
30# PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
31#
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.
35#
36# To submit patches:
37#
38# *) Read Documentation/SubmittingPatches
39# *) Send all patches to the current maintainer:
40#
41# "Shawn O. Pearce" <spearce@spearce.org>
42#
43# *) Always CC the Git mailing list:
44#
45# git@vger.kernel.org
46#
47
48__gitdir ()
49{
50 if [ -z "$1" ]; then
51 if [ -n "$__git_dir" ]; then
52 echo "$__git_dir"
53 elif [ -d .git ]; then
54 echo .git
55 else
56 git rev-parse --git-dir 2>/dev/null
57 fi
58 elif [ -d "$1/.git" ]; then
59 echo "$1/.git"
60 else
61 echo "$1"
62 fi
63}
64
65__git_ps1 ()
66{
67 local b="$(git symbolic-ref HEAD 2>/dev/null)"
68 if [ -n "$b" ]; then
69 if [ -n "$1" ]; then
70 printf "$1" "${b##refs/heads/}"
71 else
72 printf " (%s)" "${b##refs/heads/}"
73 fi
74 fi
75}
76
77__gitcomp ()
78{
79 local all c s=$'\n' IFS=' '$'\t'$'\n'
80 local cur="${COMP_WORDS[COMP_CWORD]}"
81 if [ $# -gt 2 ]; then
82 cur="$3"
83 fi
84 for c in $1; do
85 case "$c$4" in
86 --*=*) all="$all$c$4$s" ;;
87 *.) all="$all$c$4$s" ;;
88 *) all="$all$c$4 $s" ;;
89 esac
90 done
91 IFS=$s
92 COMPREPLY=($(compgen -P "$2" -W "$all" -- "$cur"))
93 return
94}
95
96__git_heads ()
97{
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)' \
102 refs/heads ); do
103 echo "${i#refs/heads/}"
104 done
105 return
106 fi
107 for i in $(git-ls-remote "$1" 2>/dev/null); do
108 case "$is_hash,$i" in
109 y,*) is_hash=n ;;
110 n,*^{}) is_hash=y ;;
111 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
112 n,*) is_hash=y; echo "$i" ;;
113 esac
114 done
115}
116
117__git_tags ()
118{
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)' \
123 refs/tags ); do
124 echo "${i#refs/tags/}"
125 done
126 return
127 fi
128 for i in $(git-ls-remote "$1" 2>/dev/null); do
129 case "$is_hash,$i" in
130 y,*) is_hash=n ;;
131 n,*^{}) is_hash=y ;;
132 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
133 n,*) is_hash=y; echo "$i" ;;
134 esac
135 done
136}
137
138__git_refs ()
139{
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
146 case "$i" in
147 refs/tags/*) echo "${i#refs/tags/}" ;;
148 refs/heads/*) echo "${i#refs/heads/}" ;;
149 refs/remotes/*) echo "${i#refs/remotes/}" ;;
150 *) echo "$i" ;;
151 esac
152 done
153 return
154 fi
155 for i in $(git-ls-remote "$dir" 2>/dev/null); do
156 case "$is_hash,$i" in
157 y,*) is_hash=n ;;
158 n,*^{}) is_hash=y ;;
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" ;;
163 esac
164 done
165}
166
167__git_refs2 ()
168{
169 local i
170 for i in $(__git_refs "$1"); do
171 echo "$i:$i"
172 done
173}
174
175__git_refs_remotes ()
176{
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
180 n,refs/heads/*)
181 is_hash=y
182 echo "$i:refs/remotes/$1/${i#refs/heads/}"
183 ;;
184 y,*) is_hash=n ;;
185 n,*^{}) is_hash=y ;;
186 n,refs/tags/*) is_hash=y;;
187 n,*) is_hash=y; ;;
188 esac
189 done
190}
191
192__git_remotes ()
193{
194 local i ngoff IFS=$'\n' d="$(__gitdir)"
195 shopt -q nullglob || ngoff=1
196 shopt -s nullglob
197 for i in "$d/remotes"/*; do
198 echo ${i#$d/remotes/}
199 done
200 [ "$ngoff" ] && shopt -u nullglob
201 for i in $(git --git-dir="$d" config --list); do
202 case "$i" in
203 remote.*.url=*)
204 i="${i#remote.}"
205 echo "${i/.url=*/}"
206 ;;
207 esac
208 done
209}
210
211__git_merge_strategies ()
212{
213 if [ -n "$__git_merge_strategylist" ]; then
214 echo "$__git_merge_strategylist"
215 return
216 fi
217 sed -n "/^all_strategies='/{
218 s/^all_strategies='//
219 s/'//
220 p
221 q
222 }" "$(git --exec-path)/git-merge"
223}
224__git_merge_strategylist=
225__git_merge_strategylist="$(__git_merge_strategies 2>/dev/null)"
226
227__git_complete_file ()
228{
229 local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
230 case "$cur" in
231 ?*:*)
232 ref="${cur%%:*}"
233 cur="${cur#*:}"
234 case "$cur" in
235 ?*/*)
236 pfx="${cur%/*}"
237 cur="${cur##*/}"
238 ls="$ref:$pfx"
239 pfx="$pfx/"
240 ;;
241 *)
242 ls="$ref"
243 ;;
244 esac
245 COMPREPLY=($(compgen -P "$pfx" \
246 -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
247 | sed '/^100... blob /s,^.* ,,
248 /^040000 tree /{
249 s,^.* ,,
250 s,$,/,
251 }
252 s/^.* //')" \
253 -- "$cur"))
254 ;;
255 *)
256 __gitcomp "$(__git_refs)"
257 ;;
258 esac
259}
260
261__git_complete_revlist ()
262{
263 local pfx cur="${COMP_WORDS[COMP_CWORD]}"
264 case "$cur" in
265 *...*)
266 pfx="${cur%...*}..."
267 cur="${cur#*...}"
268 __gitcomp "$(__git_refs)" "$pfx" "$cur"
269 ;;
270 *..*)
271 pfx="${cur%..*}.."
272 cur="${cur#*..}"
273 __gitcomp "$(__git_refs)" "$pfx" "$cur"
274 ;;
275 *.)
276 __gitcomp "$cur."
277 ;;
278 *)
279 __gitcomp "$(__git_refs)"
280 ;;
281 esac
282}
283
284__git_commands ()
285{
286 if [ -n "$__git_commandlist" ]; then
287 echo "$__git_commandlist"
288 return
289 fi
290 local i IFS=" "$'\n'
291 for i in $(git help -a|egrep '^ ')
292 do
293 case $i in
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 convert-objects) : plumbing;;
303 cvsexportcommit) : export;;
304 cvsimport) : import;;
305 cvsserver) : daemon;;
306 daemon) : daemon;;
307 diff-files) : plumbing;;
308 diff-index) : plumbing;;
309 diff-tree) : plumbing;;
310 fast-import) : import;;
311 fsck-objects) : plumbing;;
312 fetch--tool) : plumbing;;
313 fetch-pack) : plumbing;;
314 fmt-merge-msg) : plumbing;;
315 for-each-ref) : plumbing;;
316 hash-object) : plumbing;;
317 http-*) : transport;;
318 index-pack) : plumbing;;
319 init-db) : deprecated;;
320 local-fetch) : plumbing;;
321 mailinfo) : plumbing;;
322 mailsplit) : plumbing;;
323 merge-*) : plumbing;;
324 mktree) : plumbing;;
325 mktag) : plumbing;;
326 pack-objects) : plumbing;;
327 pack-redundant) : plumbing;;
328 pack-refs) : plumbing;;
329 parse-remote) : plumbing;;
330 patch-id) : plumbing;;
331 peek-remote) : plumbing;;
332 prune) : plumbing;;
333 prune-packed) : plumbing;;
334 quiltimport) : import;;
335 read-tree) : plumbing;;
336 receive-pack) : plumbing;;
337 reflog) : plumbing;;
338 repo-config) : plumbing;;
339 rerere) : plumbing;;
340 rev-list) : plumbing;;
341 rev-parse) : plumbing;;
342 runstatus) : plumbing;;
343 sh-setup) : internal;;
344 shell) : daemon;;
345 send-pack) : plumbing;;
346 show-index) : plumbing;;
347 ssh-*) : transport;;
348 stripspace) : plumbing;;
349 svn) : import export;;
350 svnimport) : import;;
351 symbolic-ref) : plumbing;;
352 tar-tree) : deprecated;;
353 unpack-file) : plumbing;;
354 unpack-objects) : plumbing;;
355 update-index) : plumbing;;
356 update-ref) : plumbing;;
357 update-server-info) : daemon;;
358 upload-archive) : plumbing;;
359 upload-pack) : plumbing;;
360 write-tree) : plumbing;;
361 verify-tag) : plumbing;;
362 *) echo $i;;
363 esac
364 done
365}
366__git_commandlist=
367__git_commandlist="$(__git_commands 2>/dev/null)"
368
369__git_aliases ()
370{
371 local i IFS=$'\n'
372 for i in $(git --git-dir="$(__gitdir)" config --list); do
373 case "$i" in
374 alias.*)
375 i="${i#alias.}"
376 echo "${i/=*/}"
377 ;;
378 esac
379 done
380}
381
382__git_aliased_command ()
383{
384 local word cmdline=$(git --git-dir="$(__gitdir)" \
385 config --get "alias.$1")
386 for word in $cmdline; do
387 if [ "${word##-*}" ]; then
388 echo $word
389 return
390 fi
391 done
392}
393
394__git_whitespacelist="nowarn warn error error-all strip"
395
396_git_am ()
397{
398 local cur="${COMP_WORDS[COMP_CWORD]}"
399 if [ -d .dotest ]; then
400 __gitcomp "--skip --resolved"
401 return
402 fi
403 case "$cur" in
404 --whitespace=*)
405 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
406 return
407 ;;
408 --*)
409 __gitcomp "
410 --signoff --utf8 --binary --3way --interactive
411 --whitespace=
412 "
413 return
414 esac
415 COMPREPLY=()
416}
417
418_git_apply ()
419{
420 local cur="${COMP_WORDS[COMP_CWORD]}"
421 case "$cur" in
422 --whitespace=*)
423 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
424 return
425 ;;
426 --*)
427 __gitcomp "
428 --stat --numstat --summary --check --index
429 --cached --index-info --reverse --reject --unidiff-zero
430 --apply --no-add --exclude=
431 --whitespace= --inaccurate-eof --verbose
432 "
433 return
434 esac
435 COMPREPLY=()
436}
437
438_git_add ()
439{
440 local cur="${COMP_WORDS[COMP_CWORD]}"
441 case "$cur" in
442 --*)
443 __gitcomp "--interactive --refresh"
444 return
445 esac
446 COMPREPLY=()
447}
448
449_git_bisect ()
450{
451 local i c=1 command
452 while [ $c -lt $COMP_CWORD ]; do
453 i="${COMP_WORDS[c]}"
454 case "$i" in
455 start|bad|good|reset|visualize|replay|log)
456 command="$i"
457 break
458 ;;
459 esac
460 c=$((++c))
461 done
462
463 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
464 __gitcomp "start bad good reset visualize replay log"
465 return
466 fi
467
468 case "$command" in
469 bad|good|reset)
470 __gitcomp "$(__git_refs)"
471 ;;
472 *)
473 COMPREPLY=()
474 ;;
475 esac
476}
477
478_git_branch ()
479{
480 __gitcomp "$(__git_refs)"
481}
482
483_git_bundle ()
484{
485 local mycword="$COMP_CWORD"
486 case "${COMP_WORDS[0]}" in
487 git)
488 local cmd="${COMP_WORDS[2]}"
489 mycword="$((mycword-1))"
490 ;;
491 git-bundle*)
492 local cmd="${COMP_WORDS[1]}"
493 ;;
494 esac
495 case "$mycword" in
496 1)
497 __gitcomp "create list-heads verify unbundle"
498 ;;
499 2)
500 # looking for a file
501 ;;
502 *)
503 case "$cmd" in
504 create)
505 __git_complete_revlist
506 ;;
507 esac
508 ;;
509 esac
510}
511
512_git_checkout ()
513{
514 __gitcomp "$(__git_refs)"
515}
516
517_git_cherry ()
518{
519 __gitcomp "$(__git_refs)"
520}
521
522_git_cherry_pick ()
523{
524 local cur="${COMP_WORDS[COMP_CWORD]}"
525 case "$cur" in
526 --*)
527 __gitcomp "--edit --no-commit"
528 ;;
529 *)
530 __gitcomp "$(__git_refs)"
531 ;;
532 esac
533}
534
535_git_commit ()
536{
537 local cur="${COMP_WORDS[COMP_CWORD]}"
538 case "$cur" in
539 --*)
540 __gitcomp "
541 --all --author= --signoff --verify --no-verify
542 --edit --amend --include --only
543 "
544 return
545 esac
546 COMPREPLY=()
547}
548
549_git_describe ()
550{
551 __gitcomp "$(__git_refs)"
552}
553
554_git_diff ()
555{
556 __git_complete_file
557}
558
559_git_diff_tree ()
560{
561 __gitcomp "$(__git_refs)"
562}
563
564_git_fetch ()
565{
566 local cur="${COMP_WORDS[COMP_CWORD]}"
567
568 case "${COMP_WORDS[0]},$COMP_CWORD" in
569 git-fetch*,1)
570 __gitcomp "$(__git_remotes)"
571 ;;
572 git,2)
573 __gitcomp "$(__git_remotes)"
574 ;;
575 *)
576 case "$cur" in
577 *:*)
578 __gitcomp "$(__git_refs)" "" "${cur#*:}"
579 ;;
580 *)
581 local remote
582 case "${COMP_WORDS[0]}" in
583 git-fetch) remote="${COMP_WORDS[1]}" ;;
584 git) remote="${COMP_WORDS[2]}" ;;
585 esac
586 __gitcomp "$(__git_refs2 "$remote")"
587 ;;
588 esac
589 ;;
590 esac
591}
592
593_git_format_patch ()
594{
595 local cur="${COMP_WORDS[COMP_CWORD]}"
596 case "$cur" in
597 --*)
598 __gitcomp "
599 --stdout --attach --thread
600 --output-directory
601 --numbered --start-number
602 --numbered-files
603 --keep-subject
604 --signoff
605 --in-reply-to=
606 --full-index --binary
607 --not --all
608 "
609 return
610 ;;
611 esac
612 __git_complete_revlist
613}
614
615_git_gc ()
616{
617 local cur="${COMP_WORDS[COMP_CWORD]}"
618 case "$cur" in
619 --*)
620 __gitcomp "--prune --aggressive"
621 return
622 ;;
623 esac
624 COMPREPLY=()
625}
626
627_git_ls_remote ()
628{
629 __gitcomp "$(__git_remotes)"
630}
631
632_git_ls_tree ()
633{
634 __git_complete_file
635}
636
637_git_log ()
638{
639 local cur="${COMP_WORDS[COMP_CWORD]}"
640 case "$cur" in
641 --pretty=*)
642 __gitcomp "
643 oneline short medium full fuller email raw
644 " "" "${cur##--pretty=}"
645 return
646 ;;
647 --date=*)
648 __gitcomp "
649 relative iso8601 rfc2822 short local default
650 " "" "${cur##--date=}"
651 return
652 ;;
653 --*)
654 __gitcomp "
655 --max-count= --max-age= --since= --after=
656 --min-age= --before= --until=
657 --root --topo-order --date-order --reverse
658 --no-merges --follow
659 --abbrev-commit --abbrev=
660 --relative-date --date=
661 --author= --committer= --grep=
662 --all-match
663 --pretty= --name-status --name-only --raw
664 --not --all
665 --left-right --cherry-pick
666 "
667 return
668 ;;
669 esac
670 __git_complete_revlist
671}
672
673_git_merge ()
674{
675 local cur="${COMP_WORDS[COMP_CWORD]}"
676 case "${COMP_WORDS[COMP_CWORD-1]}" in
677 -s|--strategy)
678 __gitcomp "$(__git_merge_strategies)"
679 return
680 esac
681 case "$cur" in
682 --strategy=*)
683 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
684 return
685 ;;
686 --*)
687 __gitcomp "
688 --no-commit --no-summary --squash --strategy
689 "
690 return
691 esac
692 __gitcomp "$(__git_refs)"
693}
694
695_git_merge_base ()
696{
697 __gitcomp "$(__git_refs)"
698}
699
700_git_name_rev ()
701{
702 __gitcomp "--tags --all --stdin"
703}
704
705_git_pull ()
706{
707 local cur="${COMP_WORDS[COMP_CWORD]}"
708
709 case "${COMP_WORDS[0]},$COMP_CWORD" in
710 git-pull*,1)
711 __gitcomp "$(__git_remotes)"
712 ;;
713 git,2)
714 __gitcomp "$(__git_remotes)"
715 ;;
716 *)
717 local remote
718 case "${COMP_WORDS[0]}" in
719 git-pull) remote="${COMP_WORDS[1]}" ;;
720 git) remote="${COMP_WORDS[2]}" ;;
721 esac
722 __gitcomp "$(__git_refs "$remote")"
723 ;;
724 esac
725}
726
727_git_push ()
728{
729 local cur="${COMP_WORDS[COMP_CWORD]}"
730
731 case "${COMP_WORDS[0]},$COMP_CWORD" in
732 git-push*,1)
733 __gitcomp "$(__git_remotes)"
734 ;;
735 git,2)
736 __gitcomp "$(__git_remotes)"
737 ;;
738 *)
739 case "$cur" in
740 *:*)
741 local remote
742 case "${COMP_WORDS[0]}" in
743 git-push) remote="${COMP_WORDS[1]}" ;;
744 git) remote="${COMP_WORDS[2]}" ;;
745 esac
746 __gitcomp "$(__git_refs "$remote")" "" "${cur#*:}"
747 ;;
748 +*)
749 __gitcomp "$(__git_refs)" + "${cur#+}"
750 ;;
751 *)
752 __gitcomp "$(__git_refs)"
753 ;;
754 esac
755 ;;
756 esac
757}
758
759_git_rebase ()
760{
761 local cur="${COMP_WORDS[COMP_CWORD]}"
762 if [ -d .dotest ] || [ -d .git/.dotest-merge ]; then
763 __gitcomp "--continue --skip --abort"
764 return
765 fi
766 case "${COMP_WORDS[COMP_CWORD-1]}" in
767 -s|--strategy)
768 __gitcomp "$(__git_merge_strategies)"
769 return
770 esac
771 case "$cur" in
772 --strategy=*)
773 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
774 return
775 ;;
776 --*)
777 __gitcomp "--onto --merge --strategy"
778 return
779 esac
780 __gitcomp "$(__git_refs)"
781}
782
783_git_config ()
784{
785 local cur="${COMP_WORDS[COMP_CWORD]}"
786 local prv="${COMP_WORDS[COMP_CWORD-1]}"
787 case "$prv" in
788 branch.*.remote)
789 __gitcomp "$(__git_remotes)"
790 return
791 ;;
792 branch.*.merge)
793 __gitcomp "$(__git_refs)"
794 return
795 ;;
796 remote.*.fetch)
797 local remote="${prv#remote.}"
798 remote="${remote%.fetch}"
799 __gitcomp "$(__git_refs_remotes "$remote")"
800 return
801 ;;
802 remote.*.push)
803 local remote="${prv#remote.}"
804 remote="${remote%.push}"
805 __gitcomp "$(git --git-dir="$(__gitdir)" \
806 for-each-ref --format='%(refname):%(refname)' \
807 refs/heads)"
808 return
809 ;;
810 pull.twohead|pull.octopus)
811 __gitcomp "$(__git_merge_strategies)"
812 return
813 ;;
814 color.branch|color.diff|color.status)
815 __gitcomp "always never auto"
816 return
817 ;;
818 color.*.*)
819 __gitcomp "
820 black red green yellow blue magenta cyan white
821 bold dim ul blink reverse
822 "
823 return
824 ;;
825 *.*)
826 COMPREPLY=()
827 return
828 ;;
829 esac
830 case "$cur" in
831 --*)
832 __gitcomp "
833 --global --system --file=
834 --list --replace-all
835 --get --get-all --get-regexp
836 --add --unset --unset-all
837 --remove-section --rename-section
838 "
839 return
840 ;;
841 branch.*.*)
842 local pfx="${cur%.*}."
843 cur="${cur##*.}"
844 __gitcomp "remote merge" "$pfx" "$cur"
845 return
846 ;;
847 branch.*)
848 local pfx="${cur%.*}."
849 cur="${cur#*.}"
850 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
851 return
852 ;;
853 remote.*.*)
854 local pfx="${cur%.*}."
855 cur="${cur##*.}"
856 __gitcomp "
857 url fetch push skipDefaultUpdate
858 receivepack uploadpack tagopt
859 " "$pfx" "$cur"
860 return
861 ;;
862 remote.*)
863 local pfx="${cur%.*}."
864 cur="${cur#*.}"
865 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
866 return
867 ;;
868 esac
869 __gitcomp "
870 apply.whitespace
871 core.fileMode
872 core.gitProxy
873 core.ignoreStat
874 core.preferSymlinkRefs
875 core.logAllRefUpdates
876 core.loosecompression
877 core.repositoryFormatVersion
878 core.sharedRepository
879 core.warnAmbiguousRefs
880 core.compression
881 core.legacyHeaders
882 core.packedGitWindowSize
883 core.packedGitLimit
884 clean.requireForce
885 color.branch
886 color.branch.current
887 color.branch.local
888 color.branch.remote
889 color.branch.plain
890 color.diff
891 color.diff.plain
892 color.diff.meta
893 color.diff.frag
894 color.diff.old
895 color.diff.new
896 color.diff.commit
897 color.diff.whitespace
898 color.pager
899 color.status
900 color.status.header
901 color.status.added
902 color.status.changed
903 color.status.untracked
904 diff.renameLimit
905 diff.renames
906 fetch.unpackLimit
907 format.headers
908 format.subjectprefix
909 gitcvs.enabled
910 gitcvs.logfile
911 gitcvs.allbinary
912 gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dvpass
913 gc.packrefs
914 gc.reflogexpire
915 gc.reflogexpireunreachable
916 gc.rerereresolved
917 gc.rerereunresolved
918 http.sslVerify
919 http.sslCert
920 http.sslKey
921 http.sslCAInfo
922 http.sslCAPath
923 http.maxRequests
924 http.lowSpeedLimit
925 http.lowSpeedTime
926 http.noEPSV
927 i18n.commitEncoding
928 i18n.logOutputEncoding
929 log.showroot
930 merge.tool
931 merge.summary
932 merge.verbosity
933 pack.window
934 pack.depth
935 pack.windowMemory
936 pack.compression
937 pack.deltaCacheSize
938 pack.deltaCacheLimit
939 pull.octopus
940 pull.twohead
941 repack.useDeltaBaseOffset
942 show.difftree
943 showbranch.default
944 tar.umask
945 transfer.unpackLimit
946 receive.unpackLimit
947 receive.denyNonFastForwards
948 user.name
949 user.email
950 user.signingkey
951 whatchanged.difftree
952 branch. remote.
953 "
954}
955
956_git_remote ()
957{
958 local i c=1 command
959 while [ $c -lt $COMP_CWORD ]; do
960 i="${COMP_WORDS[c]}"
961 case "$i" in
962 add|show|prune|update) command="$i"; break ;;
963 esac
964 c=$((++c))
965 done
966
967 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
968 __gitcomp "add show prune update"
969 return
970 fi
971
972 case "$command" in
973 show|prune)
974 __gitcomp "$(__git_remotes)"
975 ;;
976 update)
977 local i c='' IFS=$'\n'
978 for i in $(git --git-dir="$(__gitdir)" config --list); do
979 case "$i" in
980 remotes.*)
981 i="${i#remotes.}"
982 c="$c ${i/=*/}"
983 ;;
984 esac
985 done
986 __gitcomp "$c"
987 ;;
988 *)
989 COMPREPLY=()
990 ;;
991 esac
992}
993
994_git_reset ()
995{
996 local cur="${COMP_WORDS[COMP_CWORD]}"
997 case "$cur" in
998 --*)
999 __gitcomp "--mixed --hard --soft"
1000 return
1001 ;;
1002 esac
1003 __gitcomp "$(__git_refs)"
1004}
1005
1006_git_shortlog ()
1007{
1008 local cur="${COMP_WORDS[COMP_CWORD]}"
1009 case "$cur" in
1010 --*)
1011 __gitcomp "
1012 --max-count= --max-age= --since= --after=
1013 --min-age= --before= --until=
1014 --no-merges
1015 --author= --committer= --grep=
1016 --all-match
1017 --not --all
1018 --numbered --summary
1019 "
1020 return
1021 ;;
1022 esac
1023 __git_complete_revlist
1024}
1025
1026_git_show ()
1027{
1028 local cur="${COMP_WORDS[COMP_CWORD]}"
1029 case "$cur" in
1030 --pretty=*)
1031 __gitcomp "
1032 oneline short medium full fuller email raw
1033 " "" "${cur##--pretty=}"
1034 return
1035 ;;
1036 --*)
1037 __gitcomp "--pretty="
1038 return
1039 ;;
1040 esac
1041 __git_complete_file
1042}
1043
1044_git_stash ()
1045{
1046 __gitcomp 'list show apply clear'
1047}
1048
1049_git_submodule ()
1050{
1051 local i c=1 command
1052 while [ $c -lt $COMP_CWORD ]; do
1053 i="${COMP_WORDS[c]}"
1054 case "$i" in
1055 add|status|init|update) command="$i"; break ;;
1056 esac
1057 c=$((++c))
1058 done
1059
1060 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
1061 local cur="${COMP_WORDS[COMP_CWORD]}"
1062 case "$cur" in
1063 --*)
1064 __gitcomp "--quiet --cached"
1065 ;;
1066 *)
1067 __gitcomp "add status init update"
1068 ;;
1069 esac
1070 return
1071 fi
1072}
1073
1074_git_tag ()
1075{
1076 local i c=1 f=0
1077 while [ $c -lt $COMP_CWORD ]; do
1078 i="${COMP_WORDS[c]}"
1079 case "$i" in
1080 -d|-v)
1081 __gitcomp "$(__git_tags)"
1082 return
1083 ;;
1084 -f)
1085 f=1
1086 ;;
1087 esac
1088 c=$((++c))
1089 done
1090
1091 case "${COMP_WORDS[COMP_CWORD-1]}" in
1092 -m|-F)
1093 COMPREPLY=()
1094 ;;
1095 -*|tag|git-tag)
1096 if [ $f = 1 ]; then
1097 __gitcomp "$(__git_tags)"
1098 else
1099 COMPREPLY=()
1100 fi
1101 ;;
1102 *)
1103 __gitcomp "$(__git_refs)"
1104 ;;
1105 esac
1106}
1107
1108_git ()
1109{
1110 local i c=1 command __git_dir
1111
1112 while [ $c -lt $COMP_CWORD ]; do
1113 i="${COMP_WORDS[c]}"
1114 case "$i" in
1115 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1116 --bare) __git_dir="." ;;
1117 --version|--help|-p|--paginate) ;;
1118 *) command="$i"; break ;;
1119 esac
1120 c=$((++c))
1121 done
1122
1123 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
1124 case "${COMP_WORDS[COMP_CWORD]}" in
1125 --*=*) COMPREPLY=() ;;
1126 --*) __gitcomp "
1127 --no-pager
1128 --git-dir=
1129 --bare
1130 --version
1131 --exec-path
1132 "
1133 ;;
1134 *) __gitcomp "$(__git_commands) $(__git_aliases)" ;;
1135 esac
1136 return
1137 fi
1138
1139 local expansion=$(__git_aliased_command "$command")
1140 [ "$expansion" ] && command="$expansion"
1141
1142 case "$command" in
1143 am) _git_am ;;
1144 add) _git_add ;;
1145 apply) _git_apply ;;
1146 bisect) _git_bisect ;;
1147 bundle) _git_bundle ;;
1148 branch) _git_branch ;;
1149 checkout) _git_checkout ;;
1150 cherry) _git_cherry ;;
1151 cherry-pick) _git_cherry_pick ;;
1152 commit) _git_commit ;;
1153 config) _git_config ;;
1154 describe) _git_describe ;;
1155 diff) _git_diff ;;
1156 fetch) _git_fetch ;;
1157 format-patch) _git_format_patch ;;
1158 gc) _git_gc ;;
1159 log) _git_log ;;
1160 ls-remote) _git_ls_remote ;;
1161 ls-tree) _git_ls_tree ;;
1162 merge) _git_merge;;
1163 merge-base) _git_merge_base ;;
1164 name-rev) _git_name_rev ;;
1165 pull) _git_pull ;;
1166 push) _git_push ;;
1167 rebase) _git_rebase ;;
1168 remote) _git_remote ;;
1169 reset) _git_reset ;;
1170 shortlog) _git_shortlog ;;
1171 show) _git_show ;;
1172 show-branch) _git_log ;;
1173 stash) _git_stash ;;
1174 submodule) _git_submodule ;;
1175 tag) _git_tag ;;
1176 whatchanged) _git_log ;;
1177 *) COMPREPLY=() ;;
1178 esac
1179}
1180
1181_gitk ()
1182{
1183 local cur="${COMP_WORDS[COMP_CWORD]}"
1184 case "$cur" in
1185 --*)
1186 __gitcomp "--not --all"
1187 return
1188 ;;
1189 esac
1190 __git_complete_revlist
1191}
1192
1193complete -o default -o nospace -F _git git
1194complete -o default -o nospace -F _gitk gitk
1195complete -o default -o nospace -F _git_am git-am
1196complete -o default -o nospace -F _git_apply git-apply
1197complete -o default -o nospace -F _git_bisect git-bisect
1198complete -o default -o nospace -F _git_branch git-branch
1199complete -o default -o nospace -F _git_bundle git-bundle
1200complete -o default -o nospace -F _git_checkout git-checkout
1201complete -o default -o nospace -F _git_cherry git-cherry
1202complete -o default -o nospace -F _git_cherry_pick git-cherry-pick
1203complete -o default -o nospace -F _git_commit git-commit
1204complete -o default -o nospace -F _git_describe git-describe
1205complete -o default -o nospace -F _git_diff git-diff
1206complete -o default -o nospace -F _git_fetch git-fetch
1207complete -o default -o nospace -F _git_format_patch git-format-patch
1208complete -o default -o nospace -F _git_gc git-gc
1209complete -o default -o nospace -F _git_log git-log
1210complete -o default -o nospace -F _git_ls_remote git-ls-remote
1211complete -o default -o nospace -F _git_ls_tree git-ls-tree
1212complete -o default -o nospace -F _git_merge git-merge
1213complete -o default -o nospace -F _git_merge_base git-merge-base
1214complete -o default -o nospace -F _git_name_rev git-name-rev
1215complete -o default -o nospace -F _git_pull git-pull
1216complete -o default -o nospace -F _git_push git-push
1217complete -o default -o nospace -F _git_rebase git-rebase
1218complete -o default -o nospace -F _git_config git-config
1219complete -o default -o nospace -F _git_remote git-remote
1220complete -o default -o nospace -F _git_reset git-reset
1221complete -o default -o nospace -F _git_shortlog git-shortlog
1222complete -o default -o nospace -F _git_show git-show
1223complete -o default -o nospace -F _git_stash git-stash
1224complete -o default -o nospace -F _git_submodule git-submodule
1225complete -o default -o nospace -F _git_log git-show-branch
1226complete -o default -o nospace -F _git_tag git-tag
1227complete -o default -o nospace -F _git_log git-whatchanged
1228
1229# The following are necessary only for Cygwin, and only are needed
1230# when the user has tab-completed the executable name and consequently
1231# included the '.exe' suffix.
1232#
1233if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1234complete -o default -o nospace -F _git_add git-add.exe
1235complete -o default -o nospace -F _git_apply git-apply.exe
1236complete -o default -o nospace -F _git git.exe
1237complete -o default -o nospace -F _git_branch git-branch.exe
1238complete -o default -o nospace -F _git_bundle git-bundle.exe
1239complete -o default -o nospace -F _git_cherry git-cherry.exe
1240complete -o default -o nospace -F _git_describe git-describe.exe
1241complete -o default -o nospace -F _git_diff git-diff.exe
1242complete -o default -o nospace -F _git_format_patch git-format-patch.exe
1243complete -o default -o nospace -F _git_log git-log.exe
1244complete -o default -o nospace -F _git_ls_tree git-ls-tree.exe
1245complete -o default -o nospace -F _git_merge_base git-merge-base.exe
1246complete -o default -o nospace -F _git_name_rev git-name-rev.exe
1247complete -o default -o nospace -F _git_push git-push.exe
1248complete -o default -o nospace -F _git_config git-config
1249complete -o default -o nospace -F _git_shortlog git-shortlog.exe
1250complete -o default -o nospace -F _git_show git-show.exe
1251complete -o default -o nospace -F _git_log git-show-branch.exe
1252complete -o default -o nospace -F _git_tag git-tag.exe
1253complete -o default -o nospace -F _git_log git-whatchanged.exe
1254fi