1 #
2 # bash completion support for core Git.
3 #
4 # Copyright (C) 2006,2007 Shawn Pearce
5 # Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
6 #
7 # The contained completion routines provide support for completing:
8 #
9 # *) local and remote branch names
10 # *) local and remote tag names
11 # *) .git/remotes file names
12 # *) git 'subcommands'
13 # *) tree paths within 'ref:path/to/file' expressions
14 #
15 # To use these routines:
16 #
17 # 1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
18 # 2) Added the following line to your .bashrc:
19 # source ~/.git-completion.sh
20 #
21 # 3) You may want to make sure the git executable is available
22 # in your PATH before this script is sourced, as some caching
23 # is performed while the script loads. If git isn't found
24 # at source time then all lookups will be done on demand,
25 # which may be slightly slower.
26 #
27 # 4) Consider changing your PS1 to also show the current branch:
28 # PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
29 #
30 # The argument to __git_ps1 will be displayed only if you
31 # are currently in a git repository. The %s token will be
32 # the name of the current branch.
33 #
35 __gitdir ()
36 {
37 if [ -z "$1" ]; then
38 if [ -n "$__git_dir" ]; then
39 echo "$__git_dir"
40 elif [ -d .git ]; then
41 echo .git
42 else
43 git rev-parse --git-dir 2>/dev/null
44 fi
45 elif [ -d "$1/.git" ]; then
46 echo "$1/.git"
47 else
48 echo "$1"
49 fi
50 }
52 __git_ps1 ()
53 {
54 local b="$(git symbolic-ref HEAD 2>/dev/null)"
55 if [ -n "$b" ]; then
56 if [ -n "$1" ]; then
57 printf "$1" "${b##refs/heads/}"
58 else
59 printf " (%s)" "${b##refs/heads/}"
60 fi
61 fi
62 }
64 __gitcomp ()
65 {
66 local all c s=$'\n' IFS=' '$'\t'$'\n'
67 local cur="${COMP_WORDS[COMP_CWORD]}"
68 if [ $# -gt 2 ]; then
69 cur="$3"
70 fi
71 for c in $1; do
72 case "$c$4" in
73 --*=*) all="$all$c$4$s" ;;
74 *.) all="$all$c$4$s" ;;
75 *) all="$all$c$4 $s" ;;
76 esac
77 done
78 IFS=$s
79 COMPREPLY=($(compgen -P "$2" -W "$all" -- "$cur"))
80 return
81 }
83 __git_heads ()
84 {
85 local cmd i is_hash=y dir="$(__gitdir "$1")"
86 if [ -d "$dir" ]; then
87 for i in $(git --git-dir="$dir" \
88 for-each-ref --format='%(refname)' \
89 refs/heads ); do
90 echo "${i#refs/heads/}"
91 done
92 return
93 fi
94 for i in $(git-ls-remote "$1" 2>/dev/null); do
95 case "$is_hash,$i" in
96 y,*) is_hash=n ;;
97 n,*^{}) is_hash=y ;;
98 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
99 n,*) is_hash=y; echo "$i" ;;
100 esac
101 done
102 }
104 __git_refs ()
105 {
106 local cmd i is_hash=y dir="$(__gitdir "$1")"
107 if [ -d "$dir" ]; then
108 if [ -e "$dir/HEAD" ]; then echo HEAD; fi
109 for i in $(git --git-dir="$dir" \
110 for-each-ref --format='%(refname)' \
111 refs/tags refs/heads refs/remotes); do
112 case "$i" in
113 refs/tags/*) echo "${i#refs/tags/}" ;;
114 refs/heads/*) echo "${i#refs/heads/}" ;;
115 refs/remotes/*) echo "${i#refs/remotes/}" ;;
116 *) echo "$i" ;;
117 esac
118 done
119 return
120 fi
121 for i in $(git-ls-remote "$dir" 2>/dev/null); do
122 case "$is_hash,$i" in
123 y,*) is_hash=n ;;
124 n,*^{}) is_hash=y ;;
125 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
126 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
127 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
128 n,*) is_hash=y; echo "$i" ;;
129 esac
130 done
131 }
133 __git_refs2 ()
134 {
135 local i
136 for i in $(__git_refs "$1"); do
137 echo "$i:$i"
138 done
139 }
141 __git_refs_remotes ()
142 {
143 local cmd i is_hash=y
144 for i in $(git-ls-remote "$1" 2>/dev/null); do
145 case "$is_hash,$i" in
146 n,refs/heads/*)
147 is_hash=y
148 echo "$i:refs/remotes/$1/${i#refs/heads/}"
149 ;;
150 y,*) is_hash=n ;;
151 n,*^{}) is_hash=y ;;
152 n,refs/tags/*) is_hash=y;;
153 n,*) is_hash=y; ;;
154 esac
155 done
156 }
158 __git_remotes ()
159 {
160 local i ngoff IFS=$'\n' d="$(__gitdir)"
161 shopt -q nullglob || ngoff=1
162 shopt -s nullglob
163 for i in "$d/remotes"/*; do
164 echo ${i#$d/remotes/}
165 done
166 [ "$ngoff" ] && shopt -u nullglob
167 for i in $(git --git-dir="$d" config --list); do
168 case "$i" in
169 remote.*.url=*)
170 i="${i#remote.}"
171 echo "${i/.url=*/}"
172 ;;
173 esac
174 done
175 }
177 __git_merge_strategies ()
178 {
179 if [ -n "$__git_merge_strategylist" ]; then
180 echo "$__git_merge_strategylist"
181 return
182 fi
183 sed -n "/^all_strategies='/{
184 s/^all_strategies='//
185 s/'//
186 p
187 q
188 }" "$(git --exec-path)/git-merge"
189 }
190 __git_merge_strategylist=
191 __git_merge_strategylist="$(__git_merge_strategies 2>/dev/null)"
193 __git_complete_file ()
194 {
195 local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
196 case "$cur" in
197 ?*:*)
198 ref="${cur%%:*}"
199 cur="${cur#*:}"
200 case "$cur" in
201 ?*/*)
202 pfx="${cur%/*}"
203 cur="${cur##*/}"
204 ls="$ref:$pfx"
205 pfx="$pfx/"
206 ;;
207 *)
208 ls="$ref"
209 ;;
210 esac
211 COMPREPLY=($(compgen -P "$pfx" \
212 -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
213 | sed '/^100... blob /s,^.* ,,
214 /^040000 tree /{
215 s,^.* ,,
216 s,$,/,
217 }
218 s/^.* //')" \
219 -- "$cur"))
220 ;;
221 *)
222 __gitcomp "$(__git_refs)"
223 ;;
224 esac
225 }
227 __git_complete_revlist ()
228 {
229 local pfx cur="${COMP_WORDS[COMP_CWORD]}"
230 case "$cur" in
231 *...*)
232 pfx="${cur%...*}..."
233 cur="${cur#*...}"
234 __gitcomp "$(__git_refs)" "$pfx" "$cur"
235 ;;
236 *..*)
237 pfx="${cur%..*}.."
238 cur="${cur#*..}"
239 __gitcomp "$(__git_refs)" "$pfx" "$cur"
240 ;;
241 *.)
242 __gitcomp "$cur."
243 ;;
244 *)
245 __gitcomp "$(__git_refs)"
246 ;;
247 esac
248 }
250 __git_commands ()
251 {
252 if [ -n "$__git_commandlist" ]; then
253 echo "$__git_commandlist"
254 return
255 fi
256 local i IFS=" "$'\n'
257 for i in $(git help -a|egrep '^ ')
258 do
259 case $i in
260 add--interactive) : plumbing;;
261 applymbox) : ask gittus;;
262 applypatch) : ask gittus;;
263 archimport) : import;;
264 cat-file) : plumbing;;
265 check-ref-format) : plumbing;;
266 commit-tree) : plumbing;;
267 convert-objects) : plumbing;;
268 cvsexportcommit) : export;;
269 cvsimport) : import;;
270 cvsserver) : daemon;;
271 daemon) : daemon;;
272 diff-stages) : nobody uses it;;
273 fsck-objects) : plumbing;;
274 fetch-pack) : plumbing;;
275 fmt-merge-msg) : plumbing;;
276 hash-object) : plumbing;;
277 http-*) : transport;;
278 index-pack) : plumbing;;
279 init-db) : deprecated;;
280 local-fetch) : plumbing;;
281 mailinfo) : plumbing;;
282 mailsplit) : plumbing;;
283 merge-*) : plumbing;;
284 mktree) : plumbing;;
285 mktag) : plumbing;;
286 pack-objects) : plumbing;;
287 pack-redundant) : plumbing;;
288 pack-refs) : plumbing;;
289 parse-remote) : plumbing;;
290 patch-id) : plumbing;;
291 peek-remote) : plumbing;;
292 prune) : plumbing;;
293 prune-packed) : plumbing;;
294 quiltimport) : import;;
295 read-tree) : plumbing;;
296 receive-pack) : plumbing;;
297 reflog) : plumbing;;
298 repo-config) : plumbing;;
299 rerere) : plumbing;;
300 rev-list) : plumbing;;
301 rev-parse) : plumbing;;
302 runstatus) : plumbing;;
303 sh-setup) : internal;;
304 shell) : daemon;;
305 send-pack) : plumbing;;
306 show-index) : plumbing;;
307 ssh-*) : transport;;
308 stripspace) : plumbing;;
309 svn) : import export;;
310 svnimport) : import;;
311 symbolic-ref) : plumbing;;
312 tar-tree) : deprecated;;
313 unpack-file) : plumbing;;
314 unpack-objects) : plumbing;;
315 update-index) : plumbing;;
316 update-ref) : plumbing;;
317 update-server-info) : daemon;;
318 upload-archive) : plumbing;;
319 upload-pack) : plumbing;;
320 write-tree) : plumbing;;
321 verify-tag) : plumbing;;
322 *) echo $i;;
323 esac
324 done
325 }
326 __git_commandlist=
327 __git_commandlist="$(__git_commands 2>/dev/null)"
329 __git_aliases ()
330 {
331 local i IFS=$'\n'
332 for i in $(git --git-dir="$(__gitdir)" config --list); do
333 case "$i" in
334 alias.*)
335 i="${i#alias.}"
336 echo "${i/=*/}"
337 ;;
338 esac
339 done
340 }
342 __git_aliased_command ()
343 {
344 local word cmdline=$(git --git-dir="$(__gitdir)" \
345 config --get "alias.$1")
346 for word in $cmdline; do
347 if [ "${word##-*}" ]; then
348 echo $word
349 return
350 fi
351 done
352 }
354 __git_whitespacelist="nowarn warn error error-all strip"
356 _git_am ()
357 {
358 local cur="${COMP_WORDS[COMP_CWORD]}"
359 if [ -d .dotest ]; then
360 __gitcomp "--skip --resolved"
361 return
362 fi
363 case "$cur" in
364 --whitespace=*)
365 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
366 return
367 ;;
368 --*)
369 __gitcomp "
370 --signoff --utf8 --binary --3way --interactive
371 --whitespace=
372 "
373 return
374 esac
375 COMPREPLY=()
376 }
378 _git_apply ()
379 {
380 local cur="${COMP_WORDS[COMP_CWORD]}"
381 case "$cur" in
382 --whitespace=*)
383 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
384 return
385 ;;
386 --*)
387 __gitcomp "
388 --stat --numstat --summary --check --index
389 --cached --index-info --reverse --reject --unidiff-zero
390 --apply --no-add --exclude=
391 --whitespace= --inaccurate-eof --verbose
392 "
393 return
394 esac
395 COMPREPLY=()
396 }
398 _git_add ()
399 {
400 local cur="${COMP_WORDS[COMP_CWORD]}"
401 case "$cur" in
402 --*)
403 __gitcomp "--interactive"
404 return
405 esac
406 COMPREPLY=()
407 }
409 _git_branch ()
410 {
411 __gitcomp "$(__git_refs)"
412 }
414 _git_checkout ()
415 {
416 __gitcomp "$(__git_refs)"
417 }
419 _git_cherry ()
420 {
421 __gitcomp "$(__git_refs)"
422 }
424 _git_cherry_pick ()
425 {
426 local cur="${COMP_WORDS[COMP_CWORD]}"
427 case "$cur" in
428 --*)
429 __gitcomp "--edit --no-commit"
430 ;;
431 *)
432 __gitcomp "$(__git_refs)"
433 ;;
434 esac
435 }
437 _git_commit ()
438 {
439 local cur="${COMP_WORDS[COMP_CWORD]}"
440 case "$cur" in
441 --*)
442 __gitcomp "
443 --all --author= --signoff --verify --no-verify
444 --edit --amend --include --only
445 "
446 return
447 esac
448 COMPREPLY=()
449 }
451 _git_diff ()
452 {
453 __git_complete_file
454 }
456 _git_diff_tree ()
457 {
458 __gitcomp "$(__git_refs)"
459 }
461 _git_fetch ()
462 {
463 local cur="${COMP_WORDS[COMP_CWORD]}"
465 case "${COMP_WORDS[0]},$COMP_CWORD" in
466 git-fetch*,1)
467 __gitcomp "$(__git_remotes)"
468 ;;
469 git,2)
470 __gitcomp "$(__git_remotes)"
471 ;;
472 *)
473 case "$cur" in
474 *:*)
475 __gitcomp "$(__git_refs)" "" "${cur#*:}"
476 ;;
477 *)
478 local remote
479 case "${COMP_WORDS[0]}" in
480 git-fetch) remote="${COMP_WORDS[1]}" ;;
481 git) remote="${COMP_WORDS[2]}" ;;
482 esac
483 __gitcomp "$(__git_refs2 "$remote")"
484 ;;
485 esac
486 ;;
487 esac
488 }
490 _git_format_patch ()
491 {
492 local cur="${COMP_WORDS[COMP_CWORD]}"
493 case "$cur" in
494 --*)
495 __gitcomp "
496 --stdout --attach --thread
497 --output-directory
498 --numbered --start-number
499 --keep-subject
500 --signoff
501 --in-reply-to=
502 --full-index --binary
503 --not --all
504 "
505 return
506 ;;
507 esac
508 __git_complete_revlist
509 }
511 _git_ls_remote ()
512 {
513 __gitcomp "$(__git_remotes)"
514 }
516 _git_ls_tree ()
517 {
518 __git_complete_file
519 }
521 _git_log ()
522 {
523 local cur="${COMP_WORDS[COMP_CWORD]}"
524 case "$cur" in
525 --pretty=*)
526 __gitcomp "
527 oneline short medium full fuller email raw
528 " "" "${cur##--pretty=}"
529 return
530 ;;
531 --*)
532 __gitcomp "
533 --max-count= --max-age= --since= --after=
534 --min-age= --before= --until=
535 --root --not --topo-order --date-order
536 --no-merges
537 --abbrev-commit --abbrev=
538 --relative-date
539 --author= --committer= --grep=
540 --all-match
541 --pretty= --name-status --name-only
542 --not --all
543 "
544 return
545 ;;
546 esac
547 __git_complete_revlist
548 }
550 _git_merge ()
551 {
552 local cur="${COMP_WORDS[COMP_CWORD]}"
553 case "${COMP_WORDS[COMP_CWORD-1]}" in
554 -s|--strategy)
555 __gitcomp "$(__git_merge_strategies)"
556 return
557 esac
558 case "$cur" in
559 --strategy=*)
560 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
561 return
562 ;;
563 --*)
564 __gitcomp "
565 --no-commit --no-summary --squash --strategy
566 "
567 return
568 esac
569 __gitcomp "$(__git_refs)"
570 }
572 _git_merge_base ()
573 {
574 __gitcomp "$(__git_refs)"
575 }
577 _git_name_rev ()
578 {
579 __gitcomp "--tags --all --stdin"
580 }
582 _git_pull ()
583 {
584 local cur="${COMP_WORDS[COMP_CWORD]}"
586 case "${COMP_WORDS[0]},$COMP_CWORD" in
587 git-pull*,1)
588 __gitcomp "$(__git_remotes)"
589 ;;
590 git,2)
591 __gitcomp "$(__git_remotes)"
592 ;;
593 *)
594 local remote
595 case "${COMP_WORDS[0]}" in
596 git-pull) remote="${COMP_WORDS[1]}" ;;
597 git) remote="${COMP_WORDS[2]}" ;;
598 esac
599 __gitcomp "$(__git_refs "$remote")"
600 ;;
601 esac
602 }
604 _git_push ()
605 {
606 local cur="${COMP_WORDS[COMP_CWORD]}"
608 case "${COMP_WORDS[0]},$COMP_CWORD" in
609 git-push*,1)
610 __gitcomp "$(__git_remotes)"
611 ;;
612 git,2)
613 __gitcomp "$(__git_remotes)"
614 ;;
615 *)
616 case "$cur" in
617 *:*)
618 local remote
619 case "${COMP_WORDS[0]}" in
620 git-push) remote="${COMP_WORDS[1]}" ;;
621 git) remote="${COMP_WORDS[2]}" ;;
622 esac
623 __gitcomp "$(__git_refs "$remote")" "" "${cur#*:}"
624 ;;
625 *)
626 __gitcomp "$(__git_refs2)"
627 ;;
628 esac
629 ;;
630 esac
631 }
633 _git_rebase ()
634 {
635 local cur="${COMP_WORDS[COMP_CWORD]}"
636 if [ -d .dotest ]; then
637 __gitcomp "--continue --skip --abort"
638 return
639 fi
640 case "${COMP_WORDS[COMP_CWORD-1]}" in
641 -s|--strategy)
642 __gitcomp "$(__git_merge_strategies)"
643 return
644 esac
645 case "$cur" in
646 --strategy=*)
647 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
648 return
649 ;;
650 --*)
651 __gitcomp "--onto --merge --strategy"
652 return
653 esac
654 __gitcomp "$(__git_refs)"
655 }
657 _git_config ()
658 {
659 local cur="${COMP_WORDS[COMP_CWORD]}"
660 local prv="${COMP_WORDS[COMP_CWORD-1]}"
661 case "$prv" in
662 branch.*.remote)
663 __gitcomp "$(__git_remotes)"
664 return
665 ;;
666 branch.*.merge)
667 __gitcomp "$(__git_refs)"
668 return
669 ;;
670 remote.*.fetch)
671 local remote="${prv#remote.}"
672 remote="${remote%.fetch}"
673 __gitcomp "$(__git_refs_remotes "$remote")"
674 return
675 ;;
676 remote.*.push)
677 local remote="${prv#remote.}"
678 remote="${remote%.push}"
679 __gitcomp "$(git --git-dir="$(__gitdir)" \
680 for-each-ref --format='%(refname):%(refname)' \
681 refs/heads)"
682 return
683 ;;
684 pull.twohead|pull.octopus)
685 __gitcomp "$(__git_merge_strategies)"
686 return
687 ;;
688 color.branch|color.diff|color.status)
689 __gitcomp "always never auto"
690 return
691 ;;
692 color.*.*)
693 __gitcomp "
694 black red green yellow blue magenta cyan white
695 bold dim ul blink reverse
696 "
697 return
698 ;;
699 *.*)
700 COMPREPLY=()
701 return
702 ;;
703 esac
704 case "$cur" in
705 --*)
706 __gitcomp "
707 --global --list --replace-all
708 --get --get-all --get-regexp
709 --unset --unset-all
710 "
711 return
712 ;;
713 branch.*.*)
714 local pfx="${cur%.*}."
715 cur="${cur##*.}"
716 __gitcomp "remote merge" "$pfx" "$cur"
717 return
718 ;;
719 branch.*)
720 local pfx="${cur%.*}."
721 cur="${cur#*.}"
722 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
723 return
724 ;;
725 remote.*.*)
726 local pfx="${cur%.*}."
727 cur="${cur##*.}"
728 __gitcomp "url fetch push" "$pfx" "$cur"
729 return
730 ;;
731 remote.*)
732 local pfx="${cur%.*}."
733 cur="${cur#*.}"
734 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
735 return
736 ;;
737 esac
738 __gitcomp "
739 apply.whitespace
740 core.fileMode
741 core.gitProxy
742 core.ignoreStat
743 core.preferSymlinkRefs
744 core.logAllRefUpdates
745 core.repositoryFormatVersion
746 core.sharedRepository
747 core.warnAmbiguousRefs
748 core.compression
749 core.legacyHeaders
750 core.packedGitWindowSize
751 core.packedGitLimit
752 color.branch
753 color.branch.current
754 color.branch.local
755 color.branch.remote
756 color.branch.plain
757 color.diff
758 color.diff.plain
759 color.diff.meta
760 color.diff.frag
761 color.diff.old
762 color.diff.new
763 color.diff.commit
764 color.diff.whitespace
765 color.pager
766 color.status
767 color.status.header
768 color.status.added
769 color.status.changed
770 color.status.untracked
771 diff.renameLimit
772 diff.renames
773 fetch.unpackLimit
774 format.headers
775 gitcvs.enabled
776 gitcvs.logfile
777 gc.reflogexpire
778 gc.reflogexpireunreachable
779 gc.rerereresolved
780 gc.rerereunresolved
781 http.sslVerify
782 http.sslCert
783 http.sslKey
784 http.sslCAInfo
785 http.sslCAPath
786 http.maxRequests
787 http.lowSpeedLimit
788 http.lowSpeedTime
789 http.noEPSV
790 i18n.commitEncoding
791 i18n.logOutputEncoding
792 log.showroot
793 merge.summary
794 merge.verbosity
795 pack.window
796 pull.octopus
797 pull.twohead
798 repack.useDeltaBaseOffset
799 show.difftree
800 showbranch.default
801 tar.umask
802 transfer.unpackLimit
803 receive.unpackLimit
804 receive.denyNonFastForwards
805 user.name
806 user.email
807 user.signingkey
808 whatchanged.difftree
809 branch. remote.
810 "
811 }
813 _git_reset ()
814 {
815 local cur="${COMP_WORDS[COMP_CWORD]}"
816 case "$cur" in
817 --*)
818 __gitcomp "--mixed --hard --soft"
819 return
820 ;;
821 esac
822 __gitcomp "$(__git_refs)"
823 }
825 _git_show ()
826 {
827 local cur="${COMP_WORDS[COMP_CWORD]}"
828 case "$cur" in
829 --pretty=*)
830 __gitcomp "
831 oneline short medium full fuller email raw
832 " "" "${cur##--pretty=}"
833 return
834 ;;
835 --*)
836 __gitcomp "--pretty="
837 return
838 ;;
839 esac
840 __git_complete_file
841 }
843 _git ()
844 {
845 local i c=1 command __git_dir
847 while [ $c -lt $COMP_CWORD ]; do
848 i="${COMP_WORDS[c]}"
849 case "$i" in
850 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
851 --bare) __git_dir="." ;;
852 --version|--help|-p|--paginate) ;;
853 *) command="$i"; break ;;
854 esac
855 c=$((++c))
856 done
858 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
859 case "${COMP_WORDS[COMP_CWORD]}" in
860 --*=*) COMPREPLY=() ;;
861 --*) __gitcomp "--git-dir= --bare --version --exec-path" ;;
862 *) __gitcomp "$(__git_commands) $(__git_aliases)" ;;
863 esac
864 return
865 fi
867 local expansion=$(__git_aliased_command "$command")
868 [ "$expansion" ] && command="$expansion"
870 case "$command" in
871 am) _git_am ;;
872 add) _git_add ;;
873 apply) _git_apply ;;
874 branch) _git_branch ;;
875 checkout) _git_checkout ;;
876 cherry) _git_cherry ;;
877 cherry-pick) _git_cherry_pick ;;
878 commit) _git_commit ;;
879 config) _git_config ;;
880 diff) _git_diff ;;
881 diff-tree) _git_diff_tree ;;
882 fetch) _git_fetch ;;
883 format-patch) _git_format_patch ;;
884 log) _git_log ;;
885 ls-remote) _git_ls_remote ;;
886 ls-tree) _git_ls_tree ;;
887 merge) _git_merge;;
888 merge-base) _git_merge_base ;;
889 name-rev) _git_name_rev ;;
890 pull) _git_pull ;;
891 push) _git_push ;;
892 rebase) _git_rebase ;;
893 reset) _git_reset ;;
894 show) _git_show ;;
895 show-branch) _git_log ;;
896 whatchanged) _git_log ;;
897 *) COMPREPLY=() ;;
898 esac
899 }
901 _gitk ()
902 {
903 local cur="${COMP_WORDS[COMP_CWORD]}"
904 case "$cur" in
905 --*)
906 __gitcomp "--not --all"
907 return
908 ;;
909 esac
910 __git_complete_revlist
911 }
913 complete -o default -o nospace -F _git git
914 complete -o default -o nospace -F _gitk gitk
915 complete -o default -o nospace -F _git_am git-am
916 complete -o default -o nospace -F _git_apply git-apply
917 complete -o default -o nospace -F _git_branch git-branch
918 complete -o default -o nospace -F _git_checkout git-checkout
919 complete -o default -o nospace -F _git_cherry git-cherry
920 complete -o default -o nospace -F _git_cherry_pick git-cherry-pick
921 complete -o default -o nospace -F _git_commit git-commit
922 complete -o default -o nospace -F _git_diff git-diff
923 complete -o default -o nospace -F _git_diff_tree git-diff-tree
924 complete -o default -o nospace -F _git_fetch git-fetch
925 complete -o default -o nospace -F _git_format_patch git-format-patch
926 complete -o default -o nospace -F _git_log git-log
927 complete -o default -o nospace -F _git_ls_remote git-ls-remote
928 complete -o default -o nospace -F _git_ls_tree git-ls-tree
929 complete -o default -o nospace -F _git_merge git-merge
930 complete -o default -o nospace -F _git_merge_base git-merge-base
931 complete -o default -o nospace -F _git_name_rev git-name-rev
932 complete -o default -o nospace -F _git_pull git-pull
933 complete -o default -o nospace -F _git_push git-push
934 complete -o default -o nospace -F _git_rebase git-rebase
935 complete -o default -o nospace -F _git_config git-config
936 complete -o default -o nospace -F _git_reset git-reset
937 complete -o default -o nospace -F _git_show git-show
938 complete -o default -o nospace -F _git_log git-show-branch
939 complete -o default -o nospace -F _git_log git-whatchanged
941 # The following are necessary only for Cygwin, and only are needed
942 # when the user has tab-completed the executable name and consequently
943 # included the '.exe' suffix.
944 #
945 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
946 complete -o default -o nospace -F _git_add git-add.exe
947 complete -o default -o nospace -F _git_apply git-apply.exe
948 complete -o default -o nospace -F _git git.exe
949 complete -o default -o nospace -F _git_branch git-branch.exe
950 complete -o default -o nospace -F _git_cherry git-cherry.exe
951 complete -o default -o nospace -F _git_diff git-diff.exe
952 complete -o default -o nospace -F _git_diff_tree git-diff-tree.exe
953 complete -o default -o nospace -F _git_format_patch git-format-patch.exe
954 complete -o default -o nospace -F _git_log git-log.exe
955 complete -o default -o nospace -F _git_ls_tree git-ls-tree.exe
956 complete -o default -o nospace -F _git_merge_base git-merge-base.exe
957 complete -o default -o nospace -F _git_name_rev git-name-rev.exe
958 complete -o default -o nospace -F _git_push git-push.exe
959 complete -o default -o nospace -F _git_config git-config
960 complete -o default -o nospace -F _git_show git-show.exe
961 complete -o default -o nospace -F _git_log git-show-branch.exe
962 complete -o default -o nospace -F _git_log git-whatchanged.exe
963 fi