1#!bash
2#
3# bash completion support for core Git.
4#
5# Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
6# Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
7# Distributed under the GNU General Public License, version 2.0.
8#
9# The contained completion routines provide support for completing:
10#
11# *) local and remote branch names
12# *) local and remote tag names
13# *) .git/remotes file names
14# *) git 'subcommands'
15# *) tree paths within 'ref:path/to/file' expressions
16# *) common --long-options
17#
18# To use these routines:
19#
20# 1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
21# 2) Added the following line to your .bashrc:
22# source ~/.git-completion.sh
23#
24# 3) You may want to make sure the git executable is available
25# in your PATH before this script is sourced, as some caching
26# is performed while the script loads. If git isn't found
27# at source time then all lookups will be done on demand,
28# which may be slightly slower.
29#
30# 4) Consider changing your PS1 to also show the current branch:
31# PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
32#
33# The argument to __git_ps1 will be displayed only if you
34# are currently in a git repository. The %s token will be
35# the name of the current branch.
36#
37# In addition, if you set GIT_PS1_SHOWDIRTYSTATE to a nonempty
38# value, unstaged (*) and staged (+) changes will be shown next
39# to the branch name. You can configure this per-repository
40# with the bash.showDirtyState variable, which defaults to true
41# once GIT_PS1_SHOWDIRTYSTATE is enabled.
42#
43# To submit patches:
44#
45# *) Read Documentation/SubmittingPatches
46# *) Send all patches to the current maintainer:
47#
48# "Shawn O. Pearce" <spearce@spearce.org>
49#
50# *) Always CC the Git mailing list:
51#
52# git@vger.kernel.org
53#
54
55case "$COMP_WORDBREAKS" in
56*:*) : great ;;
57*) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
58esac
59
60# __gitdir accepts 0 or 1 arguments (i.e., location)
61# returns location of .git repo
62__gitdir ()
63{
64 if [ -z "${1-}" ]; then
65 if [ -n "$__git_dir" ]; then
66 echo "$__git_dir"
67 elif [ -d .git ]; then
68 echo .git
69 else
70 git rev-parse --git-dir 2>/dev/null
71 fi
72 elif [ -d "$1/.git" ]; then
73 echo "$1/.git"
74 else
75 echo "$1"
76 fi
77}
78
79# __git_ps1 accepts 0 or 1 arguments (i.e., format string)
80# returns text to add to bash PS1 prompt (includes branch name)
81__git_ps1 ()
82{
83 local g="$(__gitdir)"
84 if [ -n "$g" ]; then
85 local r
86 local b
87 if [ -d "$g/rebase-apply" ]; then
88 if [ -f "$g/rebase-apply/rebasing" ]; then
89 r="|REBASE"
90 elif [ -f "$g/rebase-apply/applying" ]; then
91 r="|AM"
92 else
93 r="|AM/REBASE"
94 fi
95 b="$(git symbolic-ref HEAD 2>/dev/null)"
96 elif [ -f "$g/rebase-merge/interactive" ]; then
97 r="|REBASE-i"
98 b="$(cat "$g/rebase-merge/head-name")"
99 elif [ -d "$g/rebase-merge" ]; then
100 r="|REBASE-m"
101 b="$(cat "$g/rebase-merge/head-name")"
102 elif [ -f "$g/MERGE_HEAD" ]; then
103 r="|MERGING"
104 b="$(git symbolic-ref HEAD 2>/dev/null)"
105 else
106 if [ -f "$g/BISECT_LOG" ]; then
107 r="|BISECTING"
108 fi
109 if ! b="$(git symbolic-ref HEAD 2>/dev/null)"; then
110 if ! b="$(git describe --exact-match HEAD 2>/dev/null)"; then
111 b="$(cut -c1-7 "$g/HEAD")..."
112 fi
113 fi
114 fi
115
116 local w
117 local i
118
119 if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ]; then
120 if [ "$(git config --bool bash.showDirtyState)" != "false" ]; then
121 git diff --no-ext-diff --ignore-submodules \
122 --quiet --exit-code || w="*"
123 if git rev-parse --quiet --verify HEAD >/dev/null; then
124 git diff-index --cached --quiet \
125 --ignore-submodules HEAD -- || i="+"
126 else
127 i="#"
128 fi
129 fi
130 fi
131
132 if [ -n "${1-}" ]; then
133 printf "$1" "${b##refs/heads/}$w$i$r"
134 else
135 printf " (%s)" "${b##refs/heads/}$w$i$r"
136 fi
137 fi
138}
139
140# __gitcomp_1 requires 2 arguments
141__gitcomp_1 ()
142{
143 local c IFS=' '$'\t'$'\n'
144 for c in $1; do
145 case "$c$2" in
146 --*=*) printf %s$'\n' "$c$2" ;;
147 *.) printf %s$'\n' "$c$2" ;;
148 *) printf %s$'\n' "$c$2 " ;;
149 esac
150 done
151}
152
153# __gitcomp accepts 1, 2, 3, or 4 arguments
154# generates completion reply with compgen
155__gitcomp ()
156{
157 local cur="${COMP_WORDS[COMP_CWORD]}"
158 if [ $# -gt 2 ]; then
159 cur="$3"
160 fi
161 case "$cur" in
162 --*=)
163 COMPREPLY=()
164 ;;
165 *)
166 local IFS=$'\n'
167 COMPREPLY=($(compgen -P "${2-}" \
168 -W "$(__gitcomp_1 "${1-}" "${4-}")" \
169 -- "$cur"))
170 ;;
171 esac
172}
173
174# __git_heads accepts 0 or 1 arguments (to pass to __gitdir)
175__git_heads ()
176{
177 local cmd i is_hash=y dir="$(__gitdir "${1-}")"
178 if [ -d "$dir" ]; then
179 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
180 refs/heads
181 return
182 fi
183 for i in $(git ls-remote "${1-}" 2>/dev/null); do
184 case "$is_hash,$i" in
185 y,*) is_hash=n ;;
186 n,*^{}) is_hash=y ;;
187 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
188 n,*) is_hash=y; echo "$i" ;;
189 esac
190 done
191}
192
193# __git_tags accepts 0 or 1 arguments (to pass to __gitdir)
194__git_tags ()
195{
196 local cmd i is_hash=y dir="$(__gitdir "${1-}")"
197 if [ -d "$dir" ]; then
198 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
199 refs/tags
200 return
201 fi
202 for i in $(git ls-remote "${1-}" 2>/dev/null); do
203 case "$is_hash,$i" in
204 y,*) is_hash=n ;;
205 n,*^{}) is_hash=y ;;
206 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
207 n,*) is_hash=y; echo "$i" ;;
208 esac
209 done
210}
211
212# __git_refs accepts 0 or 1 arguments (to pass to __gitdir)
213__git_refs ()
214{
215 local i is_hash=y dir="$(__gitdir "${1-}")"
216 local cur="${COMP_WORDS[COMP_CWORD]}" format refs
217 if [ -d "$dir" ]; then
218 case "$cur" in
219 refs|refs/*)
220 format="refname"
221 refs="${cur%/*}"
222 ;;
223 *)
224 if [ -e "$dir/HEAD" ]; then echo HEAD; fi
225 format="refname:short"
226 refs="refs/tags refs/heads refs/remotes"
227 ;;
228 esac
229 git --git-dir="$dir" for-each-ref --format="%($format)" \
230 $refs
231 return
232 fi
233 for i in $(git ls-remote "$dir" 2>/dev/null); do
234 case "$is_hash,$i" in
235 y,*) is_hash=n ;;
236 n,*^{}) is_hash=y ;;
237 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
238 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
239 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
240 n,*) is_hash=y; echo "$i" ;;
241 esac
242 done
243}
244
245# __git_refs2 requires 1 argument (to pass to __git_refs)
246__git_refs2 ()
247{
248 local i
249 for i in $(__git_refs "$1"); do
250 echo "$i:$i"
251 done
252}
253
254# __git_refs_remotes requires 1 argument (to pass to ls-remote)
255__git_refs_remotes ()
256{
257 local cmd i is_hash=y
258 for i in $(git ls-remote "$1" 2>/dev/null); do
259 case "$is_hash,$i" in
260 n,refs/heads/*)
261 is_hash=y
262 echo "$i:refs/remotes/$1/${i#refs/heads/}"
263 ;;
264 y,*) is_hash=n ;;
265 n,*^{}) is_hash=y ;;
266 n,refs/tags/*) is_hash=y;;
267 n,*) is_hash=y; ;;
268 esac
269 done
270}
271
272__git_remotes ()
273{
274 local i ngoff IFS=$'\n' d="$(__gitdir)"
275 shopt -q nullglob || ngoff=1
276 shopt -s nullglob
277 for i in "$d/remotes"/*; do
278 echo ${i#$d/remotes/}
279 done
280 [ "$ngoff" ] && shopt -u nullglob
281 for i in $(git --git-dir="$d" config --list); do
282 case "$i" in
283 remote.*.url=*)
284 i="${i#remote.}"
285 echo "${i/.url=*/}"
286 ;;
287 esac
288 done
289}
290
291__git_merge_strategies ()
292{
293 if [ -n "$__git_merge_strategylist" ]; then
294 echo "$__git_merge_strategylist"
295 return
296 fi
297 git merge -s help 2>&1 |
298 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
299 s/\.$//
300 s/.*://
301 s/^[ ]*//
302 s/[ ]*$//
303 p
304 }'
305}
306__git_merge_strategylist=
307__git_merge_strategylist=$(__git_merge_strategies 2>/dev/null)
308
309__git_complete_file ()
310{
311 local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
312 case "$cur" in
313 ?*:*)
314 ref="${cur%%:*}"
315 cur="${cur#*:}"
316 case "$cur" in
317 ?*/*)
318 pfx="${cur%/*}"
319 cur="${cur##*/}"
320 ls="$ref:$pfx"
321 pfx="$pfx/"
322 ;;
323 *)
324 ls="$ref"
325 ;;
326 esac
327
328 case "$COMP_WORDBREAKS" in
329 *:*) : great ;;
330 *) pfx="$ref:$pfx" ;;
331 esac
332
333 local IFS=$'\n'
334 COMPREPLY=($(compgen -P "$pfx" \
335 -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
336 | sed '/^100... blob /{
337 s,^.* ,,
338 s,$, ,
339 }
340 /^120000 blob /{
341 s,^.* ,,
342 s,$, ,
343 }
344 /^040000 tree /{
345 s,^.* ,,
346 s,$,/,
347 }
348 s/^.* //')" \
349 -- "$cur"))
350 ;;
351 *)
352 __gitcomp "$(__git_refs)"
353 ;;
354 esac
355}
356
357__git_complete_revlist ()
358{
359 local pfx cur="${COMP_WORDS[COMP_CWORD]}"
360 case "$cur" in
361 *...*)
362 pfx="${cur%...*}..."
363 cur="${cur#*...}"
364 __gitcomp "$(__git_refs)" "$pfx" "$cur"
365 ;;
366 *..*)
367 pfx="${cur%..*}.."
368 cur="${cur#*..}"
369 __gitcomp "$(__git_refs)" "$pfx" "$cur"
370 ;;
371 *)
372 __gitcomp "$(__git_refs)"
373 ;;
374 esac
375}
376
377__git_all_commands ()
378{
379 if [ -n "$__git_all_commandlist" ]; then
380 echo "$__git_all_commandlist"
381 return
382 fi
383 local i IFS=" "$'\n'
384 for i in $(git help -a|egrep '^ ')
385 do
386 case $i in
387 *--*) : helper pattern;;
388 *) echo $i;;
389 esac
390 done
391}
392__git_all_commandlist=
393__git_all_commandlist="$(__git_all_commands 2>/dev/null)"
394
395__git_porcelain_commands ()
396{
397 if [ -n "$__git_porcelain_commandlist" ]; then
398 echo "$__git_porcelain_commandlist"
399 return
400 fi
401 local i IFS=" "$'\n'
402 for i in "help" $(__git_all_commands)
403 do
404 case $i in
405 *--*) : helper pattern;;
406 applymbox) : ask gittus;;
407 applypatch) : ask gittus;;
408 archimport) : import;;
409 cat-file) : plumbing;;
410 check-attr) : plumbing;;
411 check-ref-format) : plumbing;;
412 checkout-index) : plumbing;;
413 commit-tree) : plumbing;;
414 count-objects) : infrequent;;
415 cvsexportcommit) : export;;
416 cvsimport) : import;;
417 cvsserver) : daemon;;
418 daemon) : daemon;;
419 diff-files) : plumbing;;
420 diff-index) : plumbing;;
421 diff-tree) : plumbing;;
422 fast-import) : import;;
423 fast-export) : export;;
424 fsck-objects) : plumbing;;
425 fetch-pack) : plumbing;;
426 fmt-merge-msg) : plumbing;;
427 for-each-ref) : plumbing;;
428 hash-object) : plumbing;;
429 http-*) : transport;;
430 index-pack) : plumbing;;
431 init-db) : deprecated;;
432 local-fetch) : plumbing;;
433 lost-found) : infrequent;;
434 ls-files) : plumbing;;
435 ls-remote) : plumbing;;
436 ls-tree) : plumbing;;
437 mailinfo) : plumbing;;
438 mailsplit) : plumbing;;
439 merge-*) : plumbing;;
440 mktree) : plumbing;;
441 mktag) : plumbing;;
442 pack-objects) : plumbing;;
443 pack-redundant) : plumbing;;
444 pack-refs) : plumbing;;
445 parse-remote) : plumbing;;
446 patch-id) : plumbing;;
447 peek-remote) : plumbing;;
448 prune) : plumbing;;
449 prune-packed) : plumbing;;
450 quiltimport) : import;;
451 read-tree) : plumbing;;
452 receive-pack) : plumbing;;
453 reflog) : plumbing;;
454 repo-config) : deprecated;;
455 rerere) : plumbing;;
456 rev-list) : plumbing;;
457 rev-parse) : plumbing;;
458 runstatus) : plumbing;;
459 sh-setup) : internal;;
460 shell) : daemon;;
461 show-ref) : plumbing;;
462 send-pack) : plumbing;;
463 show-index) : plumbing;;
464 ssh-*) : transport;;
465 stripspace) : plumbing;;
466 symbolic-ref) : plumbing;;
467 tar-tree) : deprecated;;
468 unpack-file) : plumbing;;
469 unpack-objects) : plumbing;;
470 update-index) : plumbing;;
471 update-ref) : plumbing;;
472 update-server-info) : daemon;;
473 upload-archive) : plumbing;;
474 upload-pack) : plumbing;;
475 write-tree) : plumbing;;
476 var) : infrequent;;
477 verify-pack) : infrequent;;
478 verify-tag) : plumbing;;
479 *) echo $i;;
480 esac
481 done
482}
483__git_porcelain_commandlist=
484__git_porcelain_commandlist="$(__git_porcelain_commands 2>/dev/null)"
485
486__git_aliases ()
487{
488 local i IFS=$'\n'
489 for i in $(git --git-dir="$(__gitdir)" config --list); do
490 case "$i" in
491 alias.*)
492 i="${i#alias.}"
493 echo "${i/=*/}"
494 ;;
495 esac
496 done
497}
498
499# __git_aliased_command requires 1 argument
500__git_aliased_command ()
501{
502 local word cmdline=$(git --git-dir="$(__gitdir)" \
503 config --get "alias.$1")
504 for word in $cmdline; do
505 if [ "${word##-*}" ]; then
506 echo $word
507 return
508 fi
509 done
510}
511
512# __git_find_subcommand requires 1 argument
513__git_find_subcommand ()
514{
515 local word subcommand c=1
516
517 while [ $c -lt $COMP_CWORD ]; do
518 word="${COMP_WORDS[c]}"
519 for subcommand in $1; do
520 if [ "$subcommand" = "$word" ]; then
521 echo "$subcommand"
522 return
523 fi
524 done
525 c=$((++c))
526 done
527}
528
529__git_has_doubledash ()
530{
531 local c=1
532 while [ $c -lt $COMP_CWORD ]; do
533 if [ "--" = "${COMP_WORDS[c]}" ]; then
534 return 0
535 fi
536 c=$((++c))
537 done
538 return 1
539}
540
541__git_whitespacelist="nowarn warn error error-all fix"
542
543_git_am ()
544{
545 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
546 if [ -d "$dir"/rebase-apply ]; then
547 __gitcomp "--skip --resolved --abort"
548 return
549 fi
550 case "$cur" in
551 --whitespace=*)
552 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
553 return
554 ;;
555 --*)
556 __gitcomp "
557 --signoff --utf8 --binary --3way --interactive
558 --whitespace=
559 "
560 return
561 esac
562 COMPREPLY=()
563}
564
565_git_apply ()
566{
567 local cur="${COMP_WORDS[COMP_CWORD]}"
568 case "$cur" in
569 --whitespace=*)
570 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
571 return
572 ;;
573 --*)
574 __gitcomp "
575 --stat --numstat --summary --check --index
576 --cached --index-info --reverse --reject --unidiff-zero
577 --apply --no-add --exclude=
578 --whitespace= --inaccurate-eof --verbose
579 "
580 return
581 esac
582 COMPREPLY=()
583}
584
585_git_add ()
586{
587 __git_has_doubledash && return
588
589 local cur="${COMP_WORDS[COMP_CWORD]}"
590 case "$cur" in
591 --*)
592 __gitcomp "
593 --interactive --refresh --patch --update --dry-run
594 --ignore-errors --intent-to-add
595 "
596 return
597 esac
598 COMPREPLY=()
599}
600
601_git_archive ()
602{
603 local cur="${COMP_WORDS[COMP_CWORD]}"
604 case "$cur" in
605 --format=*)
606 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
607 return
608 ;;
609 --remote=*)
610 __gitcomp "$(__git_remotes)" "" "${cur##--remote=}"
611 return
612 ;;
613 --*)
614 __gitcomp "
615 --format= --list --verbose
616 --prefix= --remote= --exec=
617 "
618 return
619 ;;
620 esac
621 __git_complete_file
622}
623
624_git_bisect ()
625{
626 __git_has_doubledash && return
627
628 local subcommands="start bad good skip reset visualize replay log run"
629 local subcommand="$(__git_find_subcommand "$subcommands")"
630 if [ -z "$subcommand" ]; then
631 __gitcomp "$subcommands"
632 return
633 fi
634
635 case "$subcommand" in
636 bad|good|reset|skip)
637 __gitcomp "$(__git_refs)"
638 ;;
639 *)
640 COMPREPLY=()
641 ;;
642 esac
643}
644
645_git_branch ()
646{
647 local i c=1 only_local_ref="n" has_r="n"
648
649 while [ $c -lt $COMP_CWORD ]; do
650 i="${COMP_WORDS[c]}"
651 case "$i" in
652 -d|-m) only_local_ref="y" ;;
653 -r) has_r="y" ;;
654 esac
655 c=$((++c))
656 done
657
658 case "${COMP_WORDS[COMP_CWORD]}" in
659 --*)
660 __gitcomp "
661 --color --no-color --verbose --abbrev= --no-abbrev
662 --track --no-track --contains --merged --no-merged
663 "
664 ;;
665 *)
666 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
667 __gitcomp "$(__git_heads)"
668 else
669 __gitcomp "$(__git_refs)"
670 fi
671 ;;
672 esac
673}
674
675_git_bundle ()
676{
677 local cmd="${COMP_WORDS[2]}"
678 case "$COMP_CWORD" in
679 2)
680 __gitcomp "create list-heads verify unbundle"
681 ;;
682 3)
683 # looking for a file
684 ;;
685 *)
686 case "$cmd" in
687 create)
688 __git_complete_revlist
689 ;;
690 esac
691 ;;
692 esac
693}
694
695_git_checkout ()
696{
697 __git_has_doubledash && return
698
699 __gitcomp "$(__git_refs)"
700}
701
702_git_cherry ()
703{
704 __gitcomp "$(__git_refs)"
705}
706
707_git_cherry_pick ()
708{
709 local cur="${COMP_WORDS[COMP_CWORD]}"
710 case "$cur" in
711 --*)
712 __gitcomp "--edit --no-commit"
713 ;;
714 *)
715 __gitcomp "$(__git_refs)"
716 ;;
717 esac
718}
719
720_git_clean ()
721{
722 __git_has_doubledash && return
723
724 local cur="${COMP_WORDS[COMP_CWORD]}"
725 case "$cur" in
726 --*)
727 __gitcomp "--dry-run --quiet"
728 return
729 ;;
730 esac
731 COMPREPLY=()
732}
733
734_git_clone ()
735{
736 local cur="${COMP_WORDS[COMP_CWORD]}"
737 case "$cur" in
738 --*)
739 __gitcomp "
740 --local
741 --no-hardlinks
742 --shared
743 --reference
744 --quiet
745 --no-checkout
746 --bare
747 --mirror
748 --origin
749 --upload-pack
750 --template=
751 --depth
752 "
753 return
754 ;;
755 esac
756 COMPREPLY=()
757}
758
759_git_commit ()
760{
761 __git_has_doubledash && return
762
763 local cur="${COMP_WORDS[COMP_CWORD]}"
764 case "$cur" in
765 --*)
766 __gitcomp "
767 --all --author= --signoff --verify --no-verify
768 --edit --amend --include --only --interactive
769 "
770 return
771 esac
772 COMPREPLY=()
773}
774
775_git_describe ()
776{
777 local cur="${COMP_WORDS[COMP_CWORD]}"
778 case "$cur" in
779 --*)
780 __gitcomp "
781 --all --tags --contains --abbrev= --candidates=
782 --exact-match --debug --long --match --always
783 "
784 return
785 esac
786 __gitcomp "$(__git_refs)"
787}
788
789__git_diff_common_options="--stat --numstat --shortstat --summary
790 --patch-with-stat --name-only --name-status --color
791 --no-color --color-words --no-renames --check
792 --full-index --binary --abbrev --diff-filter=
793 --find-copies-harder
794 --text --ignore-space-at-eol --ignore-space-change
795 --ignore-all-space --exit-code --quiet --ext-diff
796 --no-ext-diff
797 --no-prefix --src-prefix= --dst-prefix=
798 --inter-hunk-context=
799 --patience
800 --raw
801"
802
803_git_diff ()
804{
805 __git_has_doubledash && return
806
807 local cur="${COMP_WORDS[COMP_CWORD]}"
808 case "$cur" in
809 --*)
810 __gitcomp "--cached --pickaxe-all --pickaxe-regex
811 --base --ours --theirs
812 $__git_diff_common_options
813 "
814 return
815 ;;
816 esac
817 __git_complete_file
818}
819
820_git_fetch ()
821{
822 local cur="${COMP_WORDS[COMP_CWORD]}"
823
824 if [ "$COMP_CWORD" = 2 ]; then
825 __gitcomp "$(__git_remotes)"
826 else
827 case "$cur" in
828 *:*)
829 local pfx=""
830 case "$COMP_WORDBREAKS" in
831 *:*) : great ;;
832 *) pfx="${cur%%:*}:" ;;
833 esac
834 __gitcomp "$(__git_refs)" "$pfx" "${cur#*:}"
835 ;;
836 *)
837 __gitcomp "$(__git_refs2 "${COMP_WORDS[2]}")"
838 ;;
839 esac
840 fi
841}
842
843_git_format_patch ()
844{
845 local cur="${COMP_WORDS[COMP_CWORD]}"
846 case "$cur" in
847 --*)
848 __gitcomp "
849 --stdout --attach --thread
850 --output-directory
851 --numbered --start-number
852 --numbered-files
853 --keep-subject
854 --signoff
855 --in-reply-to=
856 --full-index --binary
857 --not --all
858 --cover-letter
859 --no-prefix --src-prefix= --dst-prefix=
860 --inline --suffix= --ignore-if-in-upstream
861 --subject-prefix=
862 "
863 return
864 ;;
865 esac
866 __git_complete_revlist
867}
868
869_git_gc ()
870{
871 local cur="${COMP_WORDS[COMP_CWORD]}"
872 case "$cur" in
873 --*)
874 __gitcomp "--prune --aggressive"
875 return
876 ;;
877 esac
878 COMPREPLY=()
879}
880
881_git_grep ()
882{
883 __git_has_doubledash && return
884
885 local cur="${COMP_WORDS[COMP_CWORD]}"
886 case "$cur" in
887 --*)
888 __gitcomp "
889 --cached
890 --text --ignore-case --word-regexp --invert-match
891 --full-name
892 --extended-regexp --basic-regexp --fixed-strings
893 --files-with-matches --name-only
894 --files-without-match
895 --count
896 --and --or --not --all-match
897 "
898 return
899 ;;
900 esac
901 COMPREPLY=()
902}
903
904_git_help ()
905{
906 local cur="${COMP_WORDS[COMP_CWORD]}"
907 case "$cur" in
908 --*)
909 __gitcomp "--all --info --man --web"
910 return
911 ;;
912 esac
913 __gitcomp "$(__git_all_commands)
914 attributes cli core-tutorial cvs-migration
915 diffcore gitk glossary hooks ignore modules
916 repository-layout tutorial tutorial-2
917 workflows
918 "
919}
920
921_git_init ()
922{
923 local cur="${COMP_WORDS[COMP_CWORD]}"
924 case "$cur" in
925 --shared=*)
926 __gitcomp "
927 false true umask group all world everybody
928 " "" "${cur##--shared=}"
929 return
930 ;;
931 --*)
932 __gitcomp "--quiet --bare --template= --shared --shared="
933 return
934 ;;
935 esac
936 COMPREPLY=()
937}
938
939_git_ls_files ()
940{
941 __git_has_doubledash && return
942
943 local cur="${COMP_WORDS[COMP_CWORD]}"
944 case "$cur" in
945 --*)
946 __gitcomp "--cached --deleted --modified --others --ignored
947 --stage --directory --no-empty-directory --unmerged
948 --killed --exclude= --exclude-from=
949 --exclude-per-directory= --exclude-standard
950 --error-unmatch --with-tree= --full-name
951 --abbrev --ignored --exclude-per-directory
952 "
953 return
954 ;;
955 esac
956 COMPREPLY=()
957}
958
959_git_ls_remote ()
960{
961 __gitcomp "$(__git_remotes)"
962}
963
964_git_ls_tree ()
965{
966 __git_complete_file
967}
968
969__git_log_pretty_formats="oneline short medium full fuller email raw format:"
970
971_git_log ()
972{
973 __git_has_doubledash && return
974
975 local cur="${COMP_WORDS[COMP_CWORD]}"
976 case "$cur" in
977 --pretty=*)
978 __gitcomp "$__git_log_pretty_formats
979 " "" "${cur##--pretty=}"
980 return
981 ;;
982 --date=*)
983 __gitcomp "
984 relative iso8601 rfc2822 short local default
985 " "" "${cur##--date=}"
986 return
987 ;;
988 --*)
989 __gitcomp "
990 --max-count= --max-age= --since= --after=
991 --min-age= --before= --until=
992 --root --topo-order --date-order --reverse
993 --no-merges --follow
994 --abbrev-commit --abbrev=
995 --relative-date --date=
996 --author= --committer= --grep=
997 --all-match
998 --pretty=
999 --not --all
1000 --left-right --cherry-pick
1001 --graph
1002 --decorate
1003 --walk-reflogs
1004 --parents --children --full-history
1005 --merge
1006 $__git_diff_common_options
1007 --pickaxe-all --pickaxe-regex
1008 "
1009 return
1010 ;;
1011 esac
1012 __git_complete_revlist
1013}
1014
1015_git_merge ()
1016{
1017 local cur="${COMP_WORDS[COMP_CWORD]}"
1018 case "${COMP_WORDS[COMP_CWORD-1]}" in
1019 -s|--strategy)
1020 __gitcomp "$(__git_merge_strategies)"
1021 return
1022 esac
1023 case "$cur" in
1024 --strategy=*)
1025 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
1026 return
1027 ;;
1028 --*)
1029 __gitcomp "
1030 --no-commit --no-stat --log --no-log --squash --strategy
1031 "
1032 return
1033 esac
1034 __gitcomp "$(__git_refs)"
1035}
1036
1037_git_mergetool ()
1038{
1039 local cur="${COMP_WORDS[COMP_CWORD]}"
1040 case "$cur" in
1041 --tool=*)
1042 __gitcomp "
1043 kdiff3 tkdiff meld xxdiff emerge
1044 vimdiff gvimdiff ecmerge opendiff
1045 " "" "${cur##--tool=}"
1046 return
1047 ;;
1048 --*)
1049 __gitcomp "--tool="
1050 return
1051 ;;
1052 esac
1053 COMPREPLY=()
1054}
1055
1056_git_merge_base ()
1057{
1058 __gitcomp "$(__git_refs)"
1059}
1060
1061_git_mv ()
1062{
1063 local cur="${COMP_WORDS[COMP_CWORD]}"
1064 case "$cur" in
1065 --*)
1066 __gitcomp "--dry-run"
1067 return
1068 ;;
1069 esac
1070 COMPREPLY=()
1071}
1072
1073_git_name_rev ()
1074{
1075 __gitcomp "--tags --all --stdin"
1076}
1077
1078_git_pull ()
1079{
1080 local cur="${COMP_WORDS[COMP_CWORD]}"
1081
1082 if [ "$COMP_CWORD" = 2 ]; then
1083 __gitcomp "$(__git_remotes)"
1084 else
1085 __gitcomp "$(__git_refs "${COMP_WORDS[2]}")"
1086 fi
1087}
1088
1089_git_push ()
1090{
1091 local cur="${COMP_WORDS[COMP_CWORD]}"
1092
1093 if [ "$COMP_CWORD" = 2 ]; then
1094 __gitcomp "$(__git_remotes)"
1095 else
1096 case "$cur" in
1097 *:*)
1098 local pfx=""
1099 case "$COMP_WORDBREAKS" in
1100 *:*) : great ;;
1101 *) pfx="${cur%%:*}:" ;;
1102 esac
1103
1104 __gitcomp "$(__git_refs "${COMP_WORDS[2]}")" "$pfx" "${cur#*:}"
1105 ;;
1106 +*)
1107 __gitcomp "$(__git_refs)" + "${cur#+}"
1108 ;;
1109 *)
1110 __gitcomp "$(__git_refs)"
1111 ;;
1112 esac
1113 fi
1114}
1115
1116_git_rebase ()
1117{
1118 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
1119 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1120 __gitcomp "--continue --skip --abort"
1121 return
1122 fi
1123 case "${COMP_WORDS[COMP_CWORD-1]}" in
1124 -s|--strategy)
1125 __gitcomp "$(__git_merge_strategies)"
1126 return
1127 esac
1128 case "$cur" in
1129 --strategy=*)
1130 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
1131 return
1132 ;;
1133 --*)
1134 __gitcomp "--onto --merge --strategy --interactive"
1135 return
1136 esac
1137 __gitcomp "$(__git_refs)"
1138}
1139
1140_git_send_email ()
1141{
1142 local cur="${COMP_WORDS[COMP_CWORD]}"
1143 case "$cur" in
1144 --*)
1145 __gitcomp "--bcc --cc --cc-cmd --chain-reply-to --compose
1146 --dry-run --envelope-sender --from --identity
1147 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1148 --no-suppress-from --no-thread --quiet
1149 --signed-off-by-cc --smtp-pass --smtp-server
1150 --smtp-server-port --smtp-ssl --smtp-user --subject
1151 --suppress-cc --suppress-from --thread --to
1152 --validate --no-validate"
1153 return
1154 ;;
1155 esac
1156 COMPREPLY=()
1157}
1158
1159_git_config ()
1160{
1161 local cur="${COMP_WORDS[COMP_CWORD]}"
1162 local prv="${COMP_WORDS[COMP_CWORD-1]}"
1163 case "$prv" in
1164 branch.*.remote)
1165 __gitcomp "$(__git_remotes)"
1166 return
1167 ;;
1168 branch.*.merge)
1169 __gitcomp "$(__git_refs)"
1170 return
1171 ;;
1172 remote.*.fetch)
1173 local remote="${prv#remote.}"
1174 remote="${remote%.fetch}"
1175 __gitcomp "$(__git_refs_remotes "$remote")"
1176 return
1177 ;;
1178 remote.*.push)
1179 local remote="${prv#remote.}"
1180 remote="${remote%.push}"
1181 __gitcomp "$(git --git-dir="$(__gitdir)" \
1182 for-each-ref --format='%(refname):%(refname)' \
1183 refs/heads)"
1184 return
1185 ;;
1186 pull.twohead|pull.octopus)
1187 __gitcomp "$(__git_merge_strategies)"
1188 return
1189 ;;
1190 color.branch|color.diff|color.status)
1191 __gitcomp "always never auto"
1192 return
1193 ;;
1194 color.*.*)
1195 __gitcomp "
1196 normal black red green yellow blue magenta cyan white
1197 bold dim ul blink reverse
1198 "
1199 return
1200 ;;
1201 *.*)
1202 COMPREPLY=()
1203 return
1204 ;;
1205 esac
1206 case "$cur" in
1207 --*)
1208 __gitcomp "
1209 --global --system --file=
1210 --list --replace-all
1211 --get --get-all --get-regexp
1212 --add --unset --unset-all
1213 --remove-section --rename-section
1214 "
1215 return
1216 ;;
1217 branch.*.*)
1218 local pfx="${cur%.*}."
1219 cur="${cur##*.}"
1220 __gitcomp "remote merge mergeoptions" "$pfx" "$cur"
1221 return
1222 ;;
1223 branch.*)
1224 local pfx="${cur%.*}."
1225 cur="${cur#*.}"
1226 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1227 return
1228 ;;
1229 remote.*.*)
1230 local pfx="${cur%.*}."
1231 cur="${cur##*.}"
1232 __gitcomp "
1233 url proxy fetch push mirror skipDefaultUpdate
1234 receivepack uploadpack tagopt
1235 " "$pfx" "$cur"
1236 return
1237 ;;
1238 remote.*)
1239 local pfx="${cur%.*}."
1240 cur="${cur#*.}"
1241 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1242 return
1243 ;;
1244 esac
1245 __gitcomp "
1246 apply.whitespace
1247 branch.autosetupmerge
1248 branch.autosetuprebase
1249 clean.requireForce
1250 color.branch
1251 color.branch.current
1252 color.branch.local
1253 color.branch.plain
1254 color.branch.remote
1255 color.diff
1256 color.diff.commit
1257 color.diff.frag
1258 color.diff.meta
1259 color.diff.new
1260 color.diff.old
1261 color.diff.plain
1262 color.diff.whitespace
1263 color.interactive
1264 color.interactive.header
1265 color.interactive.help
1266 color.interactive.prompt
1267 color.pager
1268 color.status
1269 color.status.added
1270 color.status.changed
1271 color.status.header
1272 color.status.nobranch
1273 color.status.untracked
1274 color.status.updated
1275 color.ui
1276 commit.template
1277 core.autocrlf
1278 core.bare
1279 core.compression
1280 core.deltaBaseCacheLimit
1281 core.editor
1282 core.excludesfile
1283 core.fileMode
1284 core.fsyncobjectfiles
1285 core.gitProxy
1286 core.ignoreCygwinFSTricks
1287 core.ignoreStat
1288 core.logAllRefUpdates
1289 core.loosecompression
1290 core.packedGitLimit
1291 core.packedGitWindowSize
1292 core.pager
1293 core.preferSymlinkRefs
1294 core.preloadindex
1295 core.quotepath
1296 core.repositoryFormatVersion
1297 core.safecrlf
1298 core.sharedRepository
1299 core.symlinks
1300 core.trustctime
1301 core.warnAmbiguousRefs
1302 core.whitespace
1303 core.worktree
1304 diff.autorefreshindex
1305 diff.external
1306 diff.mnemonicprefix
1307 diff.renameLimit
1308 diff.renameLimit.
1309 diff.renames
1310 fetch.unpackLimit
1311 format.headers
1312 format.numbered
1313 format.pretty
1314 format.suffix
1315 gc.aggressiveWindow
1316 gc.auto
1317 gc.autopacklimit
1318 gc.packrefs
1319 gc.pruneexpire
1320 gc.reflogexpire
1321 gc.reflogexpireunreachable
1322 gc.rerereresolved
1323 gc.rerereunresolved
1324 gitcvs.allbinary
1325 gitcvs.dbTableNamePrefix
1326 gitcvs.dbdriver
1327 gitcvs.dbname
1328 gitcvs.dbpass
1329 gitcvs.dbuser
1330 gitcvs.enabled
1331 gitcvs.logfile
1332 gitcvs.usecrlfattr
1333 gui.blamehistoryctx
1334 gui.commitmsgwidth
1335 gui.copyblamethreshold
1336 gui.diffcontext
1337 gui.encoding
1338 gui.fastcopyblame
1339 gui.matchtrackingbranch
1340 gui.newbranchtemplate
1341 gui.pruneduringfetch
1342 gui.spellingdictionary
1343 gui.trustmtime
1344 help.autocorrect
1345 help.browser
1346 help.format
1347 http.lowSpeedLimit
1348 http.lowSpeedTime
1349 http.maxRequests
1350 http.noEPSV
1351 http.proxy
1352 http.sslCAInfo
1353 http.sslCAPath
1354 http.sslCert
1355 http.sslKey
1356 http.sslVerify
1357 i18n.commitEncoding
1358 i18n.logOutputEncoding
1359 instaweb.browser
1360 instaweb.httpd
1361 instaweb.local
1362 instaweb.modulepath
1363 instaweb.port
1364 log.date
1365 log.showroot
1366 man.viewer
1367 merge.conflictstyle
1368 merge.log
1369 merge.renameLimit
1370 merge.stat
1371 merge.tool
1372 merge.verbosity
1373 mergetool.keepBackup
1374 pack.compression
1375 pack.deltaCacheLimit
1376 pack.deltaCacheSize
1377 pack.depth
1378 pack.indexVersion
1379 pack.packSizeLimit
1380 pack.threads
1381 pack.window
1382 pack.windowMemory
1383 pull.octopus
1384 pull.twohead
1385 receive.denyCurrentBranch
1386 receive.denyDeletes
1387 receive.denyNonFastForwards
1388 receive.fsckObjects
1389 receive.unpackLimit
1390 repack.usedeltabaseoffset
1391 rerere.autoupdate
1392 rerere.enabled
1393 showbranch.default
1394 status.relativePaths
1395 status.showUntrackedFiles
1396 tar.umask
1397 transfer.unpackLimit
1398 user.email
1399 user.name
1400 user.signingkey
1401 web.browser
1402 branch. remote.
1403 "
1404}
1405
1406_git_remote ()
1407{
1408 local subcommands="add rename rm show prune update"
1409 local subcommand="$(__git_find_subcommand "$subcommands")"
1410 if [ -z "$subcommand" ]; then
1411 __gitcomp "$subcommands"
1412 return
1413 fi
1414
1415 case "$subcommand" in
1416 rename|rm|show|prune)
1417 __gitcomp "$(__git_remotes)"
1418 ;;
1419 update)
1420 local i c='' IFS=$'\n'
1421 for i in $(git --git-dir="$(__gitdir)" config --list); do
1422 case "$i" in
1423 remotes.*)
1424 i="${i#remotes.}"
1425 c="$c ${i/=*/}"
1426 ;;
1427 esac
1428 done
1429 __gitcomp "$c"
1430 ;;
1431 *)
1432 COMPREPLY=()
1433 ;;
1434 esac
1435}
1436
1437_git_reset ()
1438{
1439 __git_has_doubledash && return
1440
1441 local cur="${COMP_WORDS[COMP_CWORD]}"
1442 case "$cur" in
1443 --*)
1444 __gitcomp "--merge --mixed --hard --soft"
1445 return
1446 ;;
1447 esac
1448 __gitcomp "$(__git_refs)"
1449}
1450
1451_git_revert ()
1452{
1453 local cur="${COMP_WORDS[COMP_CWORD]}"
1454 case "$cur" in
1455 --*)
1456 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
1457 return
1458 ;;
1459 esac
1460 __gitcomp "$(__git_refs)"
1461}
1462
1463_git_rm ()
1464{
1465 __git_has_doubledash && return
1466
1467 local cur="${COMP_WORDS[COMP_CWORD]}"
1468 case "$cur" in
1469 --*)
1470 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1471 return
1472 ;;
1473 esac
1474 COMPREPLY=()
1475}
1476
1477_git_shortlog ()
1478{
1479 __git_has_doubledash && return
1480
1481 local cur="${COMP_WORDS[COMP_CWORD]}"
1482 case "$cur" in
1483 --*)
1484 __gitcomp "
1485 --max-count= --max-age= --since= --after=
1486 --min-age= --before= --until=
1487 --no-merges
1488 --author= --committer= --grep=
1489 --all-match
1490 --not --all
1491 --numbered --summary
1492 "
1493 return
1494 ;;
1495 esac
1496 __git_complete_revlist
1497}
1498
1499_git_show ()
1500{
1501 __git_has_doubledash && return
1502
1503 local cur="${COMP_WORDS[COMP_CWORD]}"
1504 case "$cur" in
1505 --pretty=*)
1506 __gitcomp "$__git_log_pretty_formats
1507 " "" "${cur##--pretty=}"
1508 return
1509 ;;
1510 --*)
1511 __gitcomp "--pretty=
1512 $__git_diff_common_options
1513 "
1514 return
1515 ;;
1516 esac
1517 __git_complete_file
1518}
1519
1520_git_show_branch ()
1521{
1522 local cur="${COMP_WORDS[COMP_CWORD]}"
1523 case "$cur" in
1524 --*)
1525 __gitcomp "
1526 --all --remotes --topo-order --current --more=
1527 --list --independent --merge-base --no-name
1528 --sha1-name --topics --reflog
1529 "
1530 return
1531 ;;
1532 esac
1533 __git_complete_revlist
1534}
1535
1536_git_stash ()
1537{
1538 local subcommands='save list show apply clear drop pop create branch'
1539 local subcommand="$(__git_find_subcommand "$subcommands")"
1540 if [ -z "$subcommand" ]; then
1541 __gitcomp "$subcommands"
1542 else
1543 local cur="${COMP_WORDS[COMP_CWORD]}"
1544 case "$subcommand,$cur" in
1545 save,--*)
1546 __gitcomp "--keep-index"
1547 ;;
1548 apply,--*)
1549 __gitcomp "--index"
1550 ;;
1551 show,--*|drop,--*|pop,--*|branch,--*)
1552 COMPREPLY=()
1553 ;;
1554 show,*|apply,*|drop,*|pop,*|branch,*)
1555 __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
1556 | sed -n -e 's/:.*//p')"
1557 ;;
1558 *)
1559 COMPREPLY=()
1560 ;;
1561 esac
1562 fi
1563}
1564
1565_git_submodule ()
1566{
1567 __git_has_doubledash && return
1568
1569 local subcommands="add status init update summary foreach sync"
1570 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1571 local cur="${COMP_WORDS[COMP_CWORD]}"
1572 case "$cur" in
1573 --*)
1574 __gitcomp "--quiet --cached"
1575 ;;
1576 *)
1577 __gitcomp "$subcommands"
1578 ;;
1579 esac
1580 return
1581 fi
1582}
1583
1584_git_svn ()
1585{
1586 local subcommands="
1587 init fetch clone rebase dcommit log find-rev
1588 set-tree commit-diff info create-ignore propget
1589 proplist show-ignore show-externals
1590 "
1591 local subcommand="$(__git_find_subcommand "$subcommands")"
1592 if [ -z "$subcommand" ]; then
1593 __gitcomp "$subcommands"
1594 else
1595 local remote_opts="--username= --config-dir= --no-auth-cache"
1596 local fc_opts="
1597 --follow-parent --authors-file= --repack=
1598 --no-metadata --use-svm-props --use-svnsync-props
1599 --log-window-size= --no-checkout --quiet
1600 --repack-flags --user-log-author --localtime $remote_opts
1601 "
1602 local init_opts="
1603 --template= --shared= --trunk= --tags=
1604 --branches= --stdlayout --minimize-url
1605 --no-metadata --use-svm-props --use-svnsync-props
1606 --rewrite-root= $remote_opts
1607 "
1608 local cmt_opts="
1609 --edit --rmdir --find-copies-harder --copy-similarity=
1610 "
1611
1612 local cur="${COMP_WORDS[COMP_CWORD]}"
1613 case "$subcommand,$cur" in
1614 fetch,--*)
1615 __gitcomp "--revision= --fetch-all $fc_opts"
1616 ;;
1617 clone,--*)
1618 __gitcomp "--revision= $fc_opts $init_opts"
1619 ;;
1620 init,--*)
1621 __gitcomp "$init_opts"
1622 ;;
1623 dcommit,--*)
1624 __gitcomp "
1625 --merge --strategy= --verbose --dry-run
1626 --fetch-all --no-rebase $cmt_opts $fc_opts
1627 "
1628 ;;
1629 set-tree,--*)
1630 __gitcomp "--stdin $cmt_opts $fc_opts"
1631 ;;
1632 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1633 show-externals,--*)
1634 __gitcomp "--revision="
1635 ;;
1636 log,--*)
1637 __gitcomp "
1638 --limit= --revision= --verbose --incremental
1639 --oneline --show-commit --non-recursive
1640 --authors-file=
1641 "
1642 ;;
1643 rebase,--*)
1644 __gitcomp "
1645 --merge --verbose --strategy= --local
1646 --fetch-all $fc_opts
1647 "
1648 ;;
1649 commit-diff,--*)
1650 __gitcomp "--message= --file= --revision= $cmt_opts"
1651 ;;
1652 info,--*)
1653 __gitcomp "--url"
1654 ;;
1655 *)
1656 COMPREPLY=()
1657 ;;
1658 esac
1659 fi
1660}
1661
1662_git_tag ()
1663{
1664 local i c=1 f=0
1665 while [ $c -lt $COMP_CWORD ]; do
1666 i="${COMP_WORDS[c]}"
1667 case "$i" in
1668 -d|-v)
1669 __gitcomp "$(__git_tags)"
1670 return
1671 ;;
1672 -f)
1673 f=1
1674 ;;
1675 esac
1676 c=$((++c))
1677 done
1678
1679 case "${COMP_WORDS[COMP_CWORD-1]}" in
1680 -m|-F)
1681 COMPREPLY=()
1682 ;;
1683 -*|tag)
1684 if [ $f = 1 ]; then
1685 __gitcomp "$(__git_tags)"
1686 else
1687 COMPREPLY=()
1688 fi
1689 ;;
1690 *)
1691 __gitcomp "$(__git_refs)"
1692 ;;
1693 esac
1694}
1695
1696_git ()
1697{
1698 local i c=1 command __git_dir
1699
1700 while [ $c -lt $COMP_CWORD ]; do
1701 i="${COMP_WORDS[c]}"
1702 case "$i" in
1703 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1704 --bare) __git_dir="." ;;
1705 --version|-p|--paginate) ;;
1706 --help) command="help"; break ;;
1707 *) command="$i"; break ;;
1708 esac
1709 c=$((++c))
1710 done
1711
1712 if [ -z "$command" ]; then
1713 case "${COMP_WORDS[COMP_CWORD]}" in
1714 --*) __gitcomp "
1715 --paginate
1716 --no-pager
1717 --git-dir=
1718 --bare
1719 --version
1720 --exec-path
1721 --work-tree=
1722 --help
1723 "
1724 ;;
1725 *) __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
1726 esac
1727 return
1728 fi
1729
1730 local expansion=$(__git_aliased_command "$command")
1731 [ "$expansion" ] && command="$expansion"
1732
1733 case "$command" in
1734 am) _git_am ;;
1735 add) _git_add ;;
1736 apply) _git_apply ;;
1737 archive) _git_archive ;;
1738 bisect) _git_bisect ;;
1739 bundle) _git_bundle ;;
1740 branch) _git_branch ;;
1741 checkout) _git_checkout ;;
1742 cherry) _git_cherry ;;
1743 cherry-pick) _git_cherry_pick ;;
1744 clean) _git_clean ;;
1745 clone) _git_clone ;;
1746 commit) _git_commit ;;
1747 config) _git_config ;;
1748 describe) _git_describe ;;
1749 diff) _git_diff ;;
1750 fetch) _git_fetch ;;
1751 format-patch) _git_format_patch ;;
1752 gc) _git_gc ;;
1753 grep) _git_grep ;;
1754 help) _git_help ;;
1755 init) _git_init ;;
1756 log) _git_log ;;
1757 ls-files) _git_ls_files ;;
1758 ls-remote) _git_ls_remote ;;
1759 ls-tree) _git_ls_tree ;;
1760 merge) _git_merge;;
1761 mergetool) _git_mergetool;;
1762 merge-base) _git_merge_base ;;
1763 mv) _git_mv ;;
1764 name-rev) _git_name_rev ;;
1765 pull) _git_pull ;;
1766 push) _git_push ;;
1767 rebase) _git_rebase ;;
1768 remote) _git_remote ;;
1769 reset) _git_reset ;;
1770 revert) _git_revert ;;
1771 rm) _git_rm ;;
1772 send-email) _git_send_email ;;
1773 shortlog) _git_shortlog ;;
1774 show) _git_show ;;
1775 show-branch) _git_show_branch ;;
1776 stash) _git_stash ;;
1777 stage) _git_add ;;
1778 submodule) _git_submodule ;;
1779 svn) _git_svn ;;
1780 tag) _git_tag ;;
1781 whatchanged) _git_log ;;
1782 *) COMPREPLY=() ;;
1783 esac
1784}
1785
1786_gitk ()
1787{
1788 __git_has_doubledash && return
1789
1790 local cur="${COMP_WORDS[COMP_CWORD]}"
1791 local g="$(__gitdir)"
1792 local merge=""
1793 if [ -f $g/MERGE_HEAD ]; then
1794 merge="--merge"
1795 fi
1796 case "$cur" in
1797 --*)
1798 __gitcomp "--not --all $merge"
1799 return
1800 ;;
1801 esac
1802 __git_complete_revlist
1803}
1804
1805complete -o bashdefault -o default -o nospace -F _git git 2>/dev/null \
1806 || complete -o default -o nospace -F _git git
1807complete -o bashdefault -o default -o nospace -F _gitk gitk 2>/dev/null \
1808 || complete -o default -o nospace -F _gitk gitk
1809
1810# The following are necessary only for Cygwin, and only are needed
1811# when the user has tab-completed the executable name and consequently
1812# included the '.exe' suffix.
1813#
1814if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1815complete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \
1816 || complete -o default -o nospace -F _git git.exe
1817fi