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) Consider changing your PS1 to also show the current branch:
25# PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
26#
27# The argument to __git_ps1 will be displayed only if you
28# are currently in a git repository. The %s token will be
29# the name of the current branch.
30#
31# In addition, if you set GIT_PS1_SHOWDIRTYSTATE to a nonempty
32# value, unstaged (*) and staged (+) changes will be shown next
33# to the branch name. You can configure this per-repository
34# with the bash.showDirtyState variable, which defaults to true
35# once GIT_PS1_SHOWDIRTYSTATE is enabled.
36#
37# You can also see if currently something is stashed, by setting
38# GIT_PS1_SHOWSTASHSTATE to a nonempty value. If something is stashed,
39# then a '$' will be shown next to the branch name.
40#
41# If you would like to see if there're untracked files, then you can
42# set GIT_PS1_SHOWUNTRACKEDFILES to a nonempty value. If there're
43# untracked files, then a '%' will be shown next to the branch name.
44#
45# To submit patches:
46#
47# *) Read Documentation/SubmittingPatches
48# *) Send all patches to the current maintainer:
49#
50# "Shawn O. Pearce" <spearce@spearce.org>
51#
52# *) Always CC the Git mailing list:
53#
54# git@vger.kernel.org
55#
56
57case "$COMP_WORDBREAKS" in
58*:*) : great ;;
59*) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
60esac
61
62# __gitdir accepts 0 or 1 arguments (i.e., location)
63# returns location of .git repo
64__gitdir ()
65{
66 if [ -z "${1-}" ]; then
67 if [ -n "${__git_dir-}" ]; then
68 echo "$__git_dir"
69 elif [ -d .git ]; then
70 echo .git
71 else
72 git rev-parse --git-dir 2>/dev/null
73 fi
74 elif [ -d "$1/.git" ]; then
75 echo "$1/.git"
76 else
77 echo "$1"
78 fi
79}
80
81# __git_ps1 accepts 0 or 1 arguments (i.e., format string)
82# returns text to add to bash PS1 prompt (includes branch name)
83__git_ps1 ()
84{
85 local g="$(__gitdir)"
86 if [ -n "$g" ]; then
87 local r
88 local b
89 if [ -f "$g/rebase-merge/interactive" ]; then
90 r="|REBASE-i"
91 b="$(cat "$g/rebase-merge/head-name")"
92 elif [ -d "$g/rebase-merge" ]; then
93 r="|REBASE-m"
94 b="$(cat "$g/rebase-merge/head-name")"
95 else
96 if [ -d "$g/rebase-apply" ]; then
97 if [ -f "$g/rebase-apply/rebasing" ]; then
98 r="|REBASE"
99 elif [ -f "$g/rebase-apply/applying" ]; then
100 r="|AM"
101 else
102 r="|AM/REBASE"
103 fi
104 elif [ -f "$g/MERGE_HEAD" ]; then
105 r="|MERGING"
106 elif [ -f "$g/BISECT_LOG" ]; then
107 r="|BISECTING"
108 fi
109
110 b="$(git symbolic-ref HEAD 2>/dev/null)" || {
111
112 b="$(
113 case "${GIT_PS1_DESCRIBE_STYLE-}" in
114 (contains)
115 git describe --contains HEAD ;;
116 (branch)
117 git describe --contains --all HEAD ;;
118 (describe)
119 git describe HEAD ;;
120 (* | default)
121 git describe --exact-match HEAD ;;
122 esac 2>/dev/null)" ||
123
124 b="$(cut -c1-7 "$g/HEAD" 2>/dev/null)..." ||
125 b="unknown"
126 b="($b)"
127 }
128 fi
129
130 local w
131 local i
132 local s
133 local u
134 local c
135
136 if [ "true" = "$(git rev-parse --is-inside-git-dir 2>/dev/null)" ]; then
137 if [ "true" = "$(git rev-parse --is-bare-repository 2>/dev/null)" ]; then
138 c="BARE:"
139 else
140 b="GIT_DIR!"
141 fi
142 elif [ "true" = "$(git rev-parse --is-inside-work-tree 2>/dev/null)" ]; then
143 if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ]; then
144 if [ "$(git config --bool bash.showDirtyState)" != "false" ]; then
145 git diff --no-ext-diff --quiet --exit-code || w="*"
146 if git rev-parse --quiet --verify HEAD >/dev/null; then
147 git diff-index --cached --quiet HEAD -- || i="+"
148 else
149 i="#"
150 fi
151 fi
152 fi
153 if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ]; then
154 git rev-parse --verify refs/stash >/dev/null 2>&1 && s="$"
155 fi
156
157 if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ]; then
158 if [ -n "$(git ls-files --others --exclude-standard)" ]; then
159 u="%"
160 fi
161 fi
162 fi
163
164 local f="$w$i$s$u"
165 printf "${1:- (%s)}" "$c${b##refs/heads/}${f:+ $f}$r"
166 fi
167}
168
169# __gitcomp_1 requires 2 arguments
170__gitcomp_1 ()
171{
172 local c IFS=' '$'\t'$'\n'
173 for c in $1; do
174 case "$c$2" in
175 --*=*) printf %s$'\n' "$c$2" ;;
176 *.) printf %s$'\n' "$c$2" ;;
177 *) printf %s$'\n' "$c$2 " ;;
178 esac
179 done
180}
181
182# __gitcomp accepts 1, 2, 3, or 4 arguments
183# generates completion reply with compgen
184__gitcomp ()
185{
186 local cur="${COMP_WORDS[COMP_CWORD]}"
187 if [ $# -gt 2 ]; then
188 cur="$3"
189 fi
190 case "$cur" in
191 --*=)
192 COMPREPLY=()
193 ;;
194 *)
195 local IFS=$'\n'
196 COMPREPLY=($(compgen -P "${2-}" \
197 -W "$(__gitcomp_1 "${1-}" "${4-}")" \
198 -- "$cur"))
199 ;;
200 esac
201}
202
203# __git_heads accepts 0 or 1 arguments (to pass to __gitdir)
204__git_heads ()
205{
206 local cmd i is_hash=y dir="$(__gitdir "${1-}")"
207 if [ -d "$dir" ]; then
208 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
209 refs/heads
210 return
211 fi
212 for i in $(git ls-remote "${1-}" 2>/dev/null); do
213 case "$is_hash,$i" in
214 y,*) is_hash=n ;;
215 n,*^{}) is_hash=y ;;
216 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
217 n,*) is_hash=y; echo "$i" ;;
218 esac
219 done
220}
221
222# __git_tags accepts 0 or 1 arguments (to pass to __gitdir)
223__git_tags ()
224{
225 local cmd i is_hash=y dir="$(__gitdir "${1-}")"
226 if [ -d "$dir" ]; then
227 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
228 refs/tags
229 return
230 fi
231 for i in $(git ls-remote "${1-}" 2>/dev/null); do
232 case "$is_hash,$i" in
233 y,*) is_hash=n ;;
234 n,*^{}) is_hash=y ;;
235 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
236 n,*) is_hash=y; echo "$i" ;;
237 esac
238 done
239}
240
241# __git_refs accepts 0 or 1 arguments (to pass to __gitdir)
242__git_refs ()
243{
244 local i is_hash=y dir="$(__gitdir "${1-}")"
245 local cur="${COMP_WORDS[COMP_CWORD]}" format refs
246 if [ -d "$dir" ]; then
247 case "$cur" in
248 refs|refs/*)
249 format="refname"
250 refs="${cur%/*}"
251 ;;
252 *)
253 for i in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD; do
254 if [ -e "$dir/$i" ]; then echo $i; fi
255 done
256 format="refname:short"
257 refs="refs/tags refs/heads refs/remotes"
258 ;;
259 esac
260 git --git-dir="$dir" for-each-ref --format="%($format)" \
261 $refs
262 return
263 fi
264 for i in $(git ls-remote "$dir" 2>/dev/null); do
265 case "$is_hash,$i" in
266 y,*) is_hash=n ;;
267 n,*^{}) is_hash=y ;;
268 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
269 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
270 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
271 n,*) is_hash=y; echo "$i" ;;
272 esac
273 done
274}
275
276# __git_refs2 requires 1 argument (to pass to __git_refs)
277__git_refs2 ()
278{
279 local i
280 for i in $(__git_refs "$1"); do
281 echo "$i:$i"
282 done
283}
284
285# __git_refs_remotes requires 1 argument (to pass to ls-remote)
286__git_refs_remotes ()
287{
288 local cmd i is_hash=y
289 for i in $(git ls-remote "$1" 2>/dev/null); do
290 case "$is_hash,$i" in
291 n,refs/heads/*)
292 is_hash=y
293 echo "$i:refs/remotes/$1/${i#refs/heads/}"
294 ;;
295 y,*) is_hash=n ;;
296 n,*^{}) is_hash=y ;;
297 n,refs/tags/*) is_hash=y;;
298 n,*) is_hash=y; ;;
299 esac
300 done
301}
302
303__git_remotes ()
304{
305 local i ngoff IFS=$'\n' d="$(__gitdir)"
306 shopt -q nullglob || ngoff=1
307 shopt -s nullglob
308 for i in "$d/remotes"/*; do
309 echo ${i#$d/remotes/}
310 done
311 [ "$ngoff" ] && shopt -u nullglob
312 for i in $(git --git-dir="$d" config --get-regexp 'remote\..*\.url' 2>/dev/null); do
313 i="${i#remote.}"
314 echo "${i/.url*/}"
315 done
316}
317
318__git_list_merge_strategies ()
319{
320 git merge -s help 2>&1 |
321 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
322 s/\.$//
323 s/.*://
324 s/^[ ]*//
325 s/[ ]*$//
326 p
327 }'
328}
329
330__git_merge_strategies=
331# 'git merge -s help' (and thus detection of the merge strategy
332# list) fails, unfortunately, if run outside of any git working
333# tree. __git_merge_strategies is set to the empty string in
334# that case, and the detection will be repeated the next time it
335# is needed.
336__git_compute_merge_strategies ()
337{
338 : ${__git_merge_strategies:=$(__git_list_merge_strategies)}
339}
340
341__git_complete_file ()
342{
343 local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
344 case "$cur" in
345 ?*:*)
346 ref="${cur%%:*}"
347 cur="${cur#*:}"
348 case "$cur" in
349 ?*/*)
350 pfx="${cur%/*}"
351 cur="${cur##*/}"
352 ls="$ref:$pfx"
353 pfx="$pfx/"
354 ;;
355 *)
356 ls="$ref"
357 ;;
358 esac
359
360 case "$COMP_WORDBREAKS" in
361 *:*) : great ;;
362 *) pfx="$ref:$pfx" ;;
363 esac
364
365 local IFS=$'\n'
366 COMPREPLY=($(compgen -P "$pfx" \
367 -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
368 | sed '/^100... blob /{
369 s,^.* ,,
370 s,$, ,
371 }
372 /^120000 blob /{
373 s,^.* ,,
374 s,$, ,
375 }
376 /^040000 tree /{
377 s,^.* ,,
378 s,$,/,
379 }
380 s/^.* //')" \
381 -- "$cur"))
382 ;;
383 *)
384 __gitcomp "$(__git_refs)"
385 ;;
386 esac
387}
388
389__git_complete_revlist ()
390{
391 local pfx cur="${COMP_WORDS[COMP_CWORD]}"
392 case "$cur" in
393 *...*)
394 pfx="${cur%...*}..."
395 cur="${cur#*...}"
396 __gitcomp "$(__git_refs)" "$pfx" "$cur"
397 ;;
398 *..*)
399 pfx="${cur%..*}.."
400 cur="${cur#*..}"
401 __gitcomp "$(__git_refs)" "$pfx" "$cur"
402 ;;
403 *)
404 __gitcomp "$(__git_refs)"
405 ;;
406 esac
407}
408
409__git_complete_remote_or_refspec ()
410{
411 local cmd="${COMP_WORDS[1]}"
412 local cur="${COMP_WORDS[COMP_CWORD]}"
413 local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0
414 while [ $c -lt $COMP_CWORD ]; do
415 i="${COMP_WORDS[c]}"
416 case "$i" in
417 --mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
418 --all)
419 case "$cmd" in
420 push) no_complete_refspec=1 ;;
421 fetch)
422 COMPREPLY=()
423 return
424 ;;
425 *) ;;
426 esac
427 ;;
428 -*) ;;
429 *) remote="$i"; break ;;
430 esac
431 c=$((++c))
432 done
433 if [ -z "$remote" ]; then
434 __gitcomp "$(__git_remotes)"
435 return
436 fi
437 if [ $no_complete_refspec = 1 ]; then
438 COMPREPLY=()
439 return
440 fi
441 [ "$remote" = "." ] && remote=
442 case "$cur" in
443 *:*)
444 case "$COMP_WORDBREAKS" in
445 *:*) : great ;;
446 *) pfx="${cur%%:*}:" ;;
447 esac
448 cur="${cur#*:}"
449 lhs=0
450 ;;
451 +*)
452 pfx="+"
453 cur="${cur#+}"
454 ;;
455 esac
456 case "$cmd" in
457 fetch)
458 if [ $lhs = 1 ]; then
459 __gitcomp "$(__git_refs2 "$remote")" "$pfx" "$cur"
460 else
461 __gitcomp "$(__git_refs)" "$pfx" "$cur"
462 fi
463 ;;
464 pull)
465 if [ $lhs = 1 ]; then
466 __gitcomp "$(__git_refs "$remote")" "$pfx" "$cur"
467 else
468 __gitcomp "$(__git_refs)" "$pfx" "$cur"
469 fi
470 ;;
471 push)
472 if [ $lhs = 1 ]; then
473 __gitcomp "$(__git_refs)" "$pfx" "$cur"
474 else
475 __gitcomp "$(__git_refs "$remote")" "$pfx" "$cur"
476 fi
477 ;;
478 esac
479}
480
481__git_complete_strategy ()
482{
483 __git_compute_merge_strategies
484 case "${COMP_WORDS[COMP_CWORD-1]}" in
485 -s|--strategy)
486 __gitcomp "$__git_merge_strategies"
487 return 0
488 esac
489 local cur="${COMP_WORDS[COMP_CWORD]}"
490 case "$cur" in
491 --strategy=*)
492 __gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}"
493 return 0
494 ;;
495 esac
496 return 1
497}
498
499__git_list_all_commands ()
500{
501 local i IFS=" "$'\n'
502 for i in $(git help -a|egrep '^ [a-zA-Z0-9]')
503 do
504 case $i in
505 *--*) : helper pattern;;
506 *) echo $i;;
507 esac
508 done
509}
510
511__git_all_commands=
512__git_compute_all_commands ()
513{
514 : ${__git_all_commands:=$(__git_list_all_commands)}
515}
516
517__git_list_porcelain_commands ()
518{
519 local i IFS=" "$'\n'
520 __git_compute_all_commands
521 for i in "help" $__git_all_commands
522 do
523 case $i in
524 *--*) : helper pattern;;
525 applymbox) : ask gittus;;
526 applypatch) : ask gittus;;
527 archimport) : import;;
528 cat-file) : plumbing;;
529 check-attr) : plumbing;;
530 check-ref-format) : plumbing;;
531 checkout-index) : plumbing;;
532 commit-tree) : plumbing;;
533 count-objects) : infrequent;;
534 cvsexportcommit) : export;;
535 cvsimport) : import;;
536 cvsserver) : daemon;;
537 daemon) : daemon;;
538 diff-files) : plumbing;;
539 diff-index) : plumbing;;
540 diff-tree) : plumbing;;
541 fast-import) : import;;
542 fast-export) : export;;
543 fsck-objects) : plumbing;;
544 fetch-pack) : plumbing;;
545 fmt-merge-msg) : plumbing;;
546 for-each-ref) : plumbing;;
547 hash-object) : plumbing;;
548 http-*) : transport;;
549 index-pack) : plumbing;;
550 init-db) : deprecated;;
551 local-fetch) : plumbing;;
552 lost-found) : infrequent;;
553 ls-files) : plumbing;;
554 ls-remote) : plumbing;;
555 ls-tree) : plumbing;;
556 mailinfo) : plumbing;;
557 mailsplit) : plumbing;;
558 merge-*) : plumbing;;
559 mktree) : plumbing;;
560 mktag) : plumbing;;
561 pack-objects) : plumbing;;
562 pack-redundant) : plumbing;;
563 pack-refs) : plumbing;;
564 parse-remote) : plumbing;;
565 patch-id) : plumbing;;
566 peek-remote) : plumbing;;
567 prune) : plumbing;;
568 prune-packed) : plumbing;;
569 quiltimport) : import;;
570 read-tree) : plumbing;;
571 receive-pack) : plumbing;;
572 reflog) : plumbing;;
573 remote-*) : transport;;
574 repo-config) : deprecated;;
575 rerere) : plumbing;;
576 rev-list) : plumbing;;
577 rev-parse) : plumbing;;
578 runstatus) : plumbing;;
579 sh-setup) : internal;;
580 shell) : daemon;;
581 show-ref) : plumbing;;
582 send-pack) : plumbing;;
583 show-index) : plumbing;;
584 ssh-*) : transport;;
585 stripspace) : plumbing;;
586 symbolic-ref) : plumbing;;
587 tar-tree) : deprecated;;
588 unpack-file) : plumbing;;
589 unpack-objects) : plumbing;;
590 update-index) : plumbing;;
591 update-ref) : plumbing;;
592 update-server-info) : daemon;;
593 upload-archive) : plumbing;;
594 upload-pack) : plumbing;;
595 write-tree) : plumbing;;
596 var) : infrequent;;
597 verify-pack) : infrequent;;
598 verify-tag) : plumbing;;
599 *) echo $i;;
600 esac
601 done
602}
603
604__git_porcelain_commands=
605__git_compute_porcelain_commands ()
606{
607 __git_compute_all_commands
608 : ${__git_porcelain_commands:=$(__git_list_porcelain_commands)}
609}
610
611__git_aliases ()
612{
613 local i IFS=$'\n'
614 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "alias\..*" 2>/dev/null); do
615 case "$i" in
616 alias.*)
617 i="${i#alias.}"
618 echo "${i/ */}"
619 ;;
620 esac
621 done
622}
623
624# __git_aliased_command requires 1 argument
625__git_aliased_command ()
626{
627 local word cmdline=$(git --git-dir="$(__gitdir)" \
628 config --get "alias.$1")
629 for word in $cmdline; do
630 if [ "${word##-*}" ]; then
631 echo $word
632 return
633 fi
634 done
635}
636
637# __git_find_on_cmdline requires 1 argument
638__git_find_on_cmdline ()
639{
640 local word subcommand c=1
641
642 while [ $c -lt $COMP_CWORD ]; do
643 word="${COMP_WORDS[c]}"
644 for subcommand in $1; do
645 if [ "$subcommand" = "$word" ]; then
646 echo "$subcommand"
647 return
648 fi
649 done
650 c=$((++c))
651 done
652}
653
654__git_has_doubledash ()
655{
656 local c=1
657 while [ $c -lt $COMP_CWORD ]; do
658 if [ "--" = "${COMP_WORDS[c]}" ]; then
659 return 0
660 fi
661 c=$((++c))
662 done
663 return 1
664}
665
666__git_whitespacelist="nowarn warn error error-all fix"
667
668_git_am ()
669{
670 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
671 if [ -d "$dir"/rebase-apply ]; then
672 __gitcomp "--skip --continue --resolved --abort"
673 return
674 fi
675 case "$cur" in
676 --whitespace=*)
677 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
678 return
679 ;;
680 --*)
681 __gitcomp "
682 --3way --committer-date-is-author-date --ignore-date
683 --ignore-whitespace --ignore-space-change
684 --interactive --keep --no-utf8 --signoff --utf8
685 --whitespace= --scissors
686 "
687 return
688 esac
689 COMPREPLY=()
690}
691
692_git_apply ()
693{
694 local cur="${COMP_WORDS[COMP_CWORD]}"
695 case "$cur" in
696 --whitespace=*)
697 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
698 return
699 ;;
700 --*)
701 __gitcomp "
702 --stat --numstat --summary --check --index
703 --cached --index-info --reverse --reject --unidiff-zero
704 --apply --no-add --exclude=
705 --ignore-whitespace --ignore-space-change
706 --whitespace= --inaccurate-eof --verbose
707 "
708 return
709 esac
710 COMPREPLY=()
711}
712
713_git_add ()
714{
715 __git_has_doubledash && return
716
717 local cur="${COMP_WORDS[COMP_CWORD]}"
718 case "$cur" in
719 --*)
720 __gitcomp "
721 --interactive --refresh --patch --update --dry-run
722 --ignore-errors --intent-to-add
723 "
724 return
725 esac
726 COMPREPLY=()
727}
728
729_git_archive ()
730{
731 local cur="${COMP_WORDS[COMP_CWORD]}"
732 case "$cur" in
733 --format=*)
734 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
735 return
736 ;;
737 --remote=*)
738 __gitcomp "$(__git_remotes)" "" "${cur##--remote=}"
739 return
740 ;;
741 --*)
742 __gitcomp "
743 --format= --list --verbose
744 --prefix= --remote= --exec=
745 "
746 return
747 ;;
748 esac
749 __git_complete_file
750}
751
752_git_bisect ()
753{
754 __git_has_doubledash && return
755
756 local subcommands="start bad good skip reset visualize replay log run"
757 local subcommand="$(__git_find_on_cmdline "$subcommands")"
758 if [ -z "$subcommand" ]; then
759 __gitcomp "$subcommands"
760 return
761 fi
762
763 case "$subcommand" in
764 bad|good|reset|skip)
765 __gitcomp "$(__git_refs)"
766 ;;
767 *)
768 COMPREPLY=()
769 ;;
770 esac
771}
772
773_git_branch ()
774{
775 local i c=1 only_local_ref="n" has_r="n"
776
777 while [ $c -lt $COMP_CWORD ]; do
778 i="${COMP_WORDS[c]}"
779 case "$i" in
780 -d|-m) only_local_ref="y" ;;
781 -r) has_r="y" ;;
782 esac
783 c=$((++c))
784 done
785
786 case "${COMP_WORDS[COMP_CWORD]}" in
787 --*)
788 __gitcomp "
789 --color --no-color --verbose --abbrev= --no-abbrev
790 --track --no-track --contains --merged --no-merged
791 "
792 ;;
793 *)
794 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
795 __gitcomp "$(__git_heads)"
796 else
797 __gitcomp "$(__git_refs)"
798 fi
799 ;;
800 esac
801}
802
803_git_bundle ()
804{
805 local cmd="${COMP_WORDS[2]}"
806 case "$COMP_CWORD" in
807 2)
808 __gitcomp "create list-heads verify unbundle"
809 ;;
810 3)
811 # looking for a file
812 ;;
813 *)
814 case "$cmd" in
815 create)
816 __git_complete_revlist
817 ;;
818 esac
819 ;;
820 esac
821}
822
823_git_checkout ()
824{
825 __git_has_doubledash && return
826
827 local cur="${COMP_WORDS[COMP_CWORD]}"
828 case "$cur" in
829 --conflict=*)
830 __gitcomp "diff3 merge" "" "${cur##--conflict=}"
831 ;;
832 --*)
833 __gitcomp "
834 --quiet --ours --theirs --track --no-track --merge
835 --conflict= --patch
836 "
837 ;;
838 *)
839 __gitcomp "$(__git_refs)"
840 ;;
841 esac
842}
843
844_git_cherry ()
845{
846 __gitcomp "$(__git_refs)"
847}
848
849_git_cherry_pick ()
850{
851 local cur="${COMP_WORDS[COMP_CWORD]}"
852 case "$cur" in
853 --*)
854 __gitcomp "--edit --no-commit"
855 ;;
856 *)
857 __gitcomp "$(__git_refs)"
858 ;;
859 esac
860}
861
862_git_clean ()
863{
864 __git_has_doubledash && return
865
866 local cur="${COMP_WORDS[COMP_CWORD]}"
867 case "$cur" in
868 --*)
869 __gitcomp "--dry-run --quiet"
870 return
871 ;;
872 esac
873 COMPREPLY=()
874}
875
876_git_clone ()
877{
878 local cur="${COMP_WORDS[COMP_CWORD]}"
879 case "$cur" in
880 --*)
881 __gitcomp "
882 --local
883 --no-hardlinks
884 --shared
885 --reference
886 --quiet
887 --no-checkout
888 --bare
889 --mirror
890 --origin
891 --upload-pack
892 --template=
893 --depth
894 "
895 return
896 ;;
897 esac
898 COMPREPLY=()
899}
900
901_git_commit ()
902{
903 __git_has_doubledash && return
904
905 local cur="${COMP_WORDS[COMP_CWORD]}"
906 case "$cur" in
907 --cleanup=*)
908 __gitcomp "default strip verbatim whitespace
909 " "" "${cur##--cleanup=}"
910 return
911 ;;
912 --reuse-message=*)
913 __gitcomp "$(__git_refs)" "" "${cur##--reuse-message=}"
914 return
915 ;;
916 --reedit-message=*)
917 __gitcomp "$(__git_refs)" "" "${cur##--reedit-message=}"
918 return
919 ;;
920 --untracked-files=*)
921 __gitcomp "all no normal" "" "${cur##--untracked-files=}"
922 return
923 ;;
924 --*)
925 __gitcomp "
926 --all --author= --signoff --verify --no-verify
927 --edit --amend --include --only --interactive
928 --dry-run --reuse-message= --reedit-message=
929 --reset-author --file= --message= --template=
930 --cleanup= --untracked-files --untracked-files=
931 --verbose --quiet
932 "
933 return
934 esac
935 COMPREPLY=()
936}
937
938_git_describe ()
939{
940 local cur="${COMP_WORDS[COMP_CWORD]}"
941 case "$cur" in
942 --*)
943 __gitcomp "
944 --all --tags --contains --abbrev= --candidates=
945 --exact-match --debug --long --match --always
946 "
947 return
948 esac
949 __gitcomp "$(__git_refs)"
950}
951
952__git_diff_common_options="--stat --numstat --shortstat --summary
953 --patch-with-stat --name-only --name-status --color
954 --no-color --color-words --no-renames --check
955 --full-index --binary --abbrev --diff-filter=
956 --find-copies-harder
957 --text --ignore-space-at-eol --ignore-space-change
958 --ignore-all-space --exit-code --quiet --ext-diff
959 --no-ext-diff
960 --no-prefix --src-prefix= --dst-prefix=
961 --inter-hunk-context=
962 --patience
963 --raw
964 --dirstat --dirstat= --dirstat-by-file
965 --dirstat-by-file= --cumulative
966"
967
968_git_diff ()
969{
970 __git_has_doubledash && return
971
972 local cur="${COMP_WORDS[COMP_CWORD]}"
973 case "$cur" in
974 --*)
975 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
976 --base --ours --theirs
977 $__git_diff_common_options
978 "
979 return
980 ;;
981 esac
982 __git_complete_file
983}
984
985__git_mergetools_common="diffuse ecmerge emerge kdiff3 meld opendiff
986 tkdiff vimdiff gvimdiff xxdiff araxis p4merge
987"
988
989_git_difftool ()
990{
991 __git_has_doubledash && return
992
993 local cur="${COMP_WORDS[COMP_CWORD]}"
994 case "$cur" in
995 --tool=*)
996 __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
997 return
998 ;;
999 --*)
1000 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1001 --base --ours --theirs
1002 --no-renames --diff-filter= --find-copies-harder
1003 --relative --ignore-submodules
1004 --tool="
1005 return
1006 ;;
1007 esac
1008 __git_complete_file
1009}
1010
1011__git_fetch_options="
1012 --quiet --verbose --append --upload-pack --force --keep --depth=
1013 --tags --no-tags --all --prune --dry-run
1014"
1015
1016_git_fetch ()
1017{
1018 local cur="${COMP_WORDS[COMP_CWORD]}"
1019 case "$cur" in
1020 --*)
1021 __gitcomp "$__git_fetch_options"
1022 return
1023 ;;
1024 esac
1025 __git_complete_remote_or_refspec
1026}
1027
1028_git_format_patch ()
1029{
1030 local cur="${COMP_WORDS[COMP_CWORD]}"
1031 case "$cur" in
1032 --thread=*)
1033 __gitcomp "
1034 deep shallow
1035 " "" "${cur##--thread=}"
1036 return
1037 ;;
1038 --*)
1039 __gitcomp "
1040 --stdout --attach --no-attach --thread --thread=
1041 --output-directory
1042 --numbered --start-number
1043 --numbered-files
1044 --keep-subject
1045 --signoff
1046 --in-reply-to= --cc=
1047 --full-index --binary
1048 --not --all
1049 --cover-letter
1050 --no-prefix --src-prefix= --dst-prefix=
1051 --inline --suffix= --ignore-if-in-upstream
1052 --subject-prefix=
1053 "
1054 return
1055 ;;
1056 esac
1057 __git_complete_revlist
1058}
1059
1060_git_fsck ()
1061{
1062 local cur="${COMP_WORDS[COMP_CWORD]}"
1063 case "$cur" in
1064 --*)
1065 __gitcomp "
1066 --tags --root --unreachable --cache --no-reflogs --full
1067 --strict --verbose --lost-found
1068 "
1069 return
1070 ;;
1071 esac
1072 COMPREPLY=()
1073}
1074
1075_git_gc ()
1076{
1077 local cur="${COMP_WORDS[COMP_CWORD]}"
1078 case "$cur" in
1079 --*)
1080 __gitcomp "--prune --aggressive"
1081 return
1082 ;;
1083 esac
1084 COMPREPLY=()
1085}
1086
1087_git_grep ()
1088{
1089 __git_has_doubledash && return
1090
1091 local cur="${COMP_WORDS[COMP_CWORD]}"
1092 case "$cur" in
1093 --*)
1094 __gitcomp "
1095 --cached
1096 --text --ignore-case --word-regexp --invert-match
1097 --full-name
1098 --extended-regexp --basic-regexp --fixed-strings
1099 --files-with-matches --name-only
1100 --files-without-match
1101 --max-depth
1102 --count
1103 --and --or --not --all-match
1104 "
1105 return
1106 ;;
1107 esac
1108
1109 __gitcomp "$(__git_refs)"
1110}
1111
1112_git_help ()
1113{
1114 local cur="${COMP_WORDS[COMP_CWORD]}"
1115 case "$cur" in
1116 --*)
1117 __gitcomp "--all --info --man --web"
1118 return
1119 ;;
1120 esac
1121 __git_compute_all_commands
1122 __gitcomp "$__git_all_commands
1123 attributes cli core-tutorial cvs-migration
1124 diffcore gitk glossary hooks ignore modules
1125 repository-layout tutorial tutorial-2
1126 workflows
1127 "
1128}
1129
1130_git_init ()
1131{
1132 local cur="${COMP_WORDS[COMP_CWORD]}"
1133 case "$cur" in
1134 --shared=*)
1135 __gitcomp "
1136 false true umask group all world everybody
1137 " "" "${cur##--shared=}"
1138 return
1139 ;;
1140 --*)
1141 __gitcomp "--quiet --bare --template= --shared --shared="
1142 return
1143 ;;
1144 esac
1145 COMPREPLY=()
1146}
1147
1148_git_ls_files ()
1149{
1150 __git_has_doubledash && return
1151
1152 local cur="${COMP_WORDS[COMP_CWORD]}"
1153 case "$cur" in
1154 --*)
1155 __gitcomp "--cached --deleted --modified --others --ignored
1156 --stage --directory --no-empty-directory --unmerged
1157 --killed --exclude= --exclude-from=
1158 --exclude-per-directory= --exclude-standard
1159 --error-unmatch --with-tree= --full-name
1160 --abbrev --ignored --exclude-per-directory
1161 "
1162 return
1163 ;;
1164 esac
1165 COMPREPLY=()
1166}
1167
1168_git_ls_remote ()
1169{
1170 __gitcomp "$(__git_remotes)"
1171}
1172
1173_git_ls_tree ()
1174{
1175 __git_complete_file
1176}
1177
1178# Options that go well for log, shortlog and gitk
1179__git_log_common_options="
1180 --not --all
1181 --branches --tags --remotes
1182 --first-parent --merges --no-merges
1183 --max-count=
1184 --max-age= --since= --after=
1185 --min-age= --until= --before=
1186"
1187# Options that go well for log and gitk (not shortlog)
1188__git_log_gitk_options="
1189 --dense --sparse --full-history
1190 --simplify-merges --simplify-by-decoration
1191 --left-right
1192"
1193# Options that go well for log and shortlog (not gitk)
1194__git_log_shortlog_options="
1195 --author= --committer= --grep=
1196 --all-match
1197"
1198
1199__git_log_pretty_formats="oneline short medium full fuller email raw format:"
1200__git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1201
1202_git_log ()
1203{
1204 __git_has_doubledash && return
1205
1206 local cur="${COMP_WORDS[COMP_CWORD]}"
1207 local g="$(git rev-parse --git-dir 2>/dev/null)"
1208 local merge=""
1209 if [ -f "$g/MERGE_HEAD" ]; then
1210 merge="--merge"
1211 fi
1212 case "$cur" in
1213 --pretty=*)
1214 __gitcomp "$__git_log_pretty_formats
1215 " "" "${cur##--pretty=}"
1216 return
1217 ;;
1218 --format=*)
1219 __gitcomp "$__git_log_pretty_formats
1220 " "" "${cur##--format=}"
1221 return
1222 ;;
1223 --date=*)
1224 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1225 return
1226 ;;
1227 --decorate=*)
1228 __gitcomp "long short" "" "${cur##--decorate=}"
1229 return
1230 ;;
1231 --*)
1232 __gitcomp "
1233 $__git_log_common_options
1234 $__git_log_shortlog_options
1235 $__git_log_gitk_options
1236 --root --topo-order --date-order --reverse
1237 --follow --full-diff
1238 --abbrev-commit --abbrev=
1239 --relative-date --date=
1240 --pretty= --format= --oneline
1241 --cherry-pick
1242 --graph
1243 --decorate --decorate=
1244 --walk-reflogs
1245 --parents --children
1246 $merge
1247 $__git_diff_common_options
1248 --pickaxe-all --pickaxe-regex
1249 "
1250 return
1251 ;;
1252 esac
1253 __git_complete_revlist
1254}
1255
1256__git_merge_options="
1257 --no-commit --no-stat --log --no-log --squash --strategy
1258 --commit --stat --no-squash --ff --no-ff --ff-only
1259"
1260
1261_git_merge ()
1262{
1263 __git_complete_strategy && return
1264
1265 local cur="${COMP_WORDS[COMP_CWORD]}"
1266 case "$cur" in
1267 --*)
1268 __gitcomp "$__git_merge_options"
1269 return
1270 esac
1271 __gitcomp "$(__git_refs)"
1272}
1273
1274_git_mergetool ()
1275{
1276 local cur="${COMP_WORDS[COMP_CWORD]}"
1277 case "$cur" in
1278 --tool=*)
1279 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1280 return
1281 ;;
1282 --*)
1283 __gitcomp "--tool="
1284 return
1285 ;;
1286 esac
1287 COMPREPLY=()
1288}
1289
1290_git_merge_base ()
1291{
1292 __gitcomp "$(__git_refs)"
1293}
1294
1295_git_mv ()
1296{
1297 local cur="${COMP_WORDS[COMP_CWORD]}"
1298 case "$cur" in
1299 --*)
1300 __gitcomp "--dry-run"
1301 return
1302 ;;
1303 esac
1304 COMPREPLY=()
1305}
1306
1307_git_name_rev ()
1308{
1309 __gitcomp "--tags --all --stdin"
1310}
1311
1312_git_notes ()
1313{
1314 local subcommands="edit show"
1315 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
1316 __gitcomp "$subcommands"
1317 return
1318 fi
1319
1320 case "${COMP_WORDS[COMP_CWORD-1]}" in
1321 -m|-F)
1322 COMPREPLY=()
1323 ;;
1324 *)
1325 __gitcomp "$(__git_refs)"
1326 ;;
1327 esac
1328}
1329
1330_git_pull ()
1331{
1332 __git_complete_strategy && return
1333
1334 local cur="${COMP_WORDS[COMP_CWORD]}"
1335 case "$cur" in
1336 --*)
1337 __gitcomp "
1338 --rebase --no-rebase
1339 $__git_merge_options
1340 $__git_fetch_options
1341 "
1342 return
1343 ;;
1344 esac
1345 __git_complete_remote_or_refspec
1346}
1347
1348_git_push ()
1349{
1350 local cur="${COMP_WORDS[COMP_CWORD]}"
1351 case "${COMP_WORDS[COMP_CWORD-1]}" in
1352 --repo)
1353 __gitcomp "$(__git_remotes)"
1354 return
1355 esac
1356 case "$cur" in
1357 --repo=*)
1358 __gitcomp "$(__git_remotes)" "" "${cur##--repo=}"
1359 return
1360 ;;
1361 --*)
1362 __gitcomp "
1363 --all --mirror --tags --dry-run --force --verbose
1364 --receive-pack= --repo=
1365 "
1366 return
1367 ;;
1368 esac
1369 __git_complete_remote_or_refspec
1370}
1371
1372_git_rebase ()
1373{
1374 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
1375 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1376 __gitcomp "--continue --skip --abort"
1377 return
1378 fi
1379 __git_complete_strategy && return
1380 case "$cur" in
1381 --whitespace=*)
1382 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1383 return
1384 ;;
1385 --*)
1386 __gitcomp "
1387 --onto --merge --strategy --interactive
1388 --preserve-merges --stat --no-stat
1389 --committer-date-is-author-date --ignore-date
1390 --ignore-whitespace --whitespace=
1391 --autosquash
1392 "
1393
1394 return
1395 esac
1396 __gitcomp "$(__git_refs)"
1397}
1398
1399__git_send_email_confirm_options="always never auto cc compose"
1400__git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
1401
1402_git_send_email ()
1403{
1404 local cur="${COMP_WORDS[COMP_CWORD]}"
1405 case "$cur" in
1406 --confirm=*)
1407 __gitcomp "
1408 $__git_send_email_confirm_options
1409 " "" "${cur##--confirm=}"
1410 return
1411 ;;
1412 --suppress-cc=*)
1413 __gitcomp "
1414 $__git_send_email_suppresscc_options
1415 " "" "${cur##--suppress-cc=}"
1416
1417 return
1418 ;;
1419 --smtp-encryption=*)
1420 __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1421 return
1422 ;;
1423 --*)
1424 __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1425 --compose --confirm= --dry-run --envelope-sender
1426 --from --identity
1427 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1428 --no-suppress-from --no-thread --quiet
1429 --signed-off-by-cc --smtp-pass --smtp-server
1430 --smtp-server-port --smtp-encryption= --smtp-user
1431 --subject --suppress-cc= --suppress-from --thread --to
1432 --validate --no-validate"
1433 return
1434 ;;
1435 esac
1436 COMPREPLY=()
1437}
1438
1439__git_config_get_set_variables ()
1440{
1441 local prevword word config_file= c=$COMP_CWORD
1442 while [ $c -gt 1 ]; do
1443 word="${COMP_WORDS[c]}"
1444 case "$word" in
1445 --global|--system|--file=*)
1446 config_file="$word"
1447 break
1448 ;;
1449 -f|--file)
1450 config_file="$word $prevword"
1451 break
1452 ;;
1453 esac
1454 prevword=$word
1455 c=$((--c))
1456 done
1457
1458 git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null |
1459 while read line
1460 do
1461 case "$line" in
1462 *.*=*)
1463 echo "${line/=*/}"
1464 ;;
1465 esac
1466 done
1467}
1468
1469_git_config ()
1470{
1471 local cur="${COMP_WORDS[COMP_CWORD]}"
1472 local prv="${COMP_WORDS[COMP_CWORD-1]}"
1473 case "$prv" in
1474 branch.*.remote)
1475 __gitcomp "$(__git_remotes)"
1476 return
1477 ;;
1478 branch.*.merge)
1479 __gitcomp "$(__git_refs)"
1480 return
1481 ;;
1482 remote.*.fetch)
1483 local remote="${prv#remote.}"
1484 remote="${remote%.fetch}"
1485 __gitcomp "$(__git_refs_remotes "$remote")"
1486 return
1487 ;;
1488 remote.*.push)
1489 local remote="${prv#remote.}"
1490 remote="${remote%.push}"
1491 __gitcomp "$(git --git-dir="$(__gitdir)" \
1492 for-each-ref --format='%(refname):%(refname)' \
1493 refs/heads)"
1494 return
1495 ;;
1496 pull.twohead|pull.octopus)
1497 __git_compute_merge_strategies
1498 __gitcomp "$__git_merge_strategies"
1499 return
1500 ;;
1501 color.branch|color.diff|color.interactive|\
1502 color.showbranch|color.status|color.ui)
1503 __gitcomp "always never auto"
1504 return
1505 ;;
1506 color.pager)
1507 __gitcomp "false true"
1508 return
1509 ;;
1510 color.*.*)
1511 __gitcomp "
1512 normal black red green yellow blue magenta cyan white
1513 bold dim ul blink reverse
1514 "
1515 return
1516 ;;
1517 help.format)
1518 __gitcomp "man info web html"
1519 return
1520 ;;
1521 log.date)
1522 __gitcomp "$__git_log_date_formats"
1523 return
1524 ;;
1525 sendemail.aliasesfiletype)
1526 __gitcomp "mutt mailrc pine elm gnus"
1527 return
1528 ;;
1529 sendemail.confirm)
1530 __gitcomp "$__git_send_email_confirm_options"
1531 return
1532 ;;
1533 sendemail.suppresscc)
1534 __gitcomp "$__git_send_email_suppresscc_options"
1535 return
1536 ;;
1537 --get|--get-all|--unset|--unset-all)
1538 __gitcomp "$(__git_config_get_set_variables)"
1539 return
1540 ;;
1541 *.*)
1542 COMPREPLY=()
1543 return
1544 ;;
1545 esac
1546 case "$cur" in
1547 --*)
1548 __gitcomp "
1549 --global --system --file=
1550 --list --replace-all
1551 --get --get-all --get-regexp
1552 --add --unset --unset-all
1553 --remove-section --rename-section
1554 "
1555 return
1556 ;;
1557 branch.*.*)
1558 local pfx="${cur%.*}."
1559 cur="${cur##*.}"
1560 __gitcomp "remote merge mergeoptions rebase" "$pfx" "$cur"
1561 return
1562 ;;
1563 branch.*)
1564 local pfx="${cur%.*}."
1565 cur="${cur#*.}"
1566 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1567 return
1568 ;;
1569 guitool.*.*)
1570 local pfx="${cur%.*}."
1571 cur="${cur##*.}"
1572 __gitcomp "
1573 argprompt cmd confirm needsfile noconsole norescan
1574 prompt revprompt revunmerged title
1575 " "$pfx" "$cur"
1576 return
1577 ;;
1578 difftool.*.*)
1579 local pfx="${cur%.*}."
1580 cur="${cur##*.}"
1581 __gitcomp "cmd path" "$pfx" "$cur"
1582 return
1583 ;;
1584 man.*.*)
1585 local pfx="${cur%.*}."
1586 cur="${cur##*.}"
1587 __gitcomp "cmd path" "$pfx" "$cur"
1588 return
1589 ;;
1590 mergetool.*.*)
1591 local pfx="${cur%.*}."
1592 cur="${cur##*.}"
1593 __gitcomp "cmd path trustExitCode" "$pfx" "$cur"
1594 return
1595 ;;
1596 pager.*)
1597 local pfx="${cur%.*}."
1598 cur="${cur#*.}"
1599 __git_compute_all_commands
1600 __gitcomp "$__git_all_commands" "$pfx" "$cur"
1601 return
1602 ;;
1603 remote.*.*)
1604 local pfx="${cur%.*}."
1605 cur="${cur##*.}"
1606 __gitcomp "
1607 url proxy fetch push mirror skipDefaultUpdate
1608 receivepack uploadpack tagopt pushurl
1609 " "$pfx" "$cur"
1610 return
1611 ;;
1612 remote.*)
1613 local pfx="${cur%.*}."
1614 cur="${cur#*.}"
1615 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1616 return
1617 ;;
1618 url.*.*)
1619 local pfx="${cur%.*}."
1620 cur="${cur##*.}"
1621 __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur"
1622 return
1623 ;;
1624 esac
1625 __gitcomp "
1626 add.ignore-errors
1627 alias.
1628 apply.ignorewhitespace
1629 apply.whitespace
1630 branch.autosetupmerge
1631 branch.autosetuprebase
1632 clean.requireForce
1633 color.branch
1634 color.branch.current
1635 color.branch.local
1636 color.branch.plain
1637 color.branch.remote
1638 color.diff
1639 color.diff.commit
1640 color.diff.frag
1641 color.diff.meta
1642 color.diff.new
1643 color.diff.old
1644 color.diff.plain
1645 color.diff.whitespace
1646 color.grep
1647 color.grep.external
1648 color.grep.match
1649 color.interactive
1650 color.interactive.header
1651 color.interactive.help
1652 color.interactive.prompt
1653 color.pager
1654 color.showbranch
1655 color.status
1656 color.status.added
1657 color.status.changed
1658 color.status.header
1659 color.status.nobranch
1660 color.status.untracked
1661 color.status.updated
1662 color.ui
1663 commit.template
1664 core.autocrlf
1665 core.bare
1666 core.compression
1667 core.createObject
1668 core.deltaBaseCacheLimit
1669 core.editor
1670 core.excludesfile
1671 core.fileMode
1672 core.fsyncobjectfiles
1673 core.gitProxy
1674 core.ignoreCygwinFSTricks
1675 core.ignoreStat
1676 core.logAllRefUpdates
1677 core.loosecompression
1678 core.packedGitLimit
1679 core.packedGitWindowSize
1680 core.pager
1681 core.preferSymlinkRefs
1682 core.preloadindex
1683 core.quotepath
1684 core.repositoryFormatVersion
1685 core.safecrlf
1686 core.sharedRepository
1687 core.symlinks
1688 core.trustctime
1689 core.warnAmbiguousRefs
1690 core.whitespace
1691 core.worktree
1692 diff.autorefreshindex
1693 diff.external
1694 diff.mnemonicprefix
1695 diff.renameLimit
1696 diff.renameLimit.
1697 diff.renames
1698 diff.suppressBlankEmpty
1699 diff.tool
1700 diff.wordRegex
1701 difftool.
1702 difftool.prompt
1703 fetch.unpackLimit
1704 format.attach
1705 format.cc
1706 format.headers
1707 format.numbered
1708 format.pretty
1709 format.signoff
1710 format.subjectprefix
1711 format.suffix
1712 format.thread
1713 gc.aggressiveWindow
1714 gc.auto
1715 gc.autopacklimit
1716 gc.packrefs
1717 gc.pruneexpire
1718 gc.reflogexpire
1719 gc.reflogexpireunreachable
1720 gc.rerereresolved
1721 gc.rerereunresolved
1722 gitcvs.allbinary
1723 gitcvs.commitmsgannotation
1724 gitcvs.dbTableNamePrefix
1725 gitcvs.dbdriver
1726 gitcvs.dbname
1727 gitcvs.dbpass
1728 gitcvs.dbuser
1729 gitcvs.enabled
1730 gitcvs.logfile
1731 gitcvs.usecrlfattr
1732 guitool.
1733 gui.blamehistoryctx
1734 gui.commitmsgwidth
1735 gui.copyblamethreshold
1736 gui.diffcontext
1737 gui.encoding
1738 gui.fastcopyblame
1739 gui.matchtrackingbranch
1740 gui.newbranchtemplate
1741 gui.pruneduringfetch
1742 gui.spellingdictionary
1743 gui.trustmtime
1744 help.autocorrect
1745 help.browser
1746 help.format
1747 http.lowSpeedLimit
1748 http.lowSpeedTime
1749 http.maxRequests
1750 http.noEPSV
1751 http.proxy
1752 http.sslCAInfo
1753 http.sslCAPath
1754 http.sslCert
1755 http.sslKey
1756 http.sslVerify
1757 i18n.commitEncoding
1758 i18n.logOutputEncoding
1759 imap.folder
1760 imap.host
1761 imap.pass
1762 imap.port
1763 imap.preformattedHTML
1764 imap.sslverify
1765 imap.tunnel
1766 imap.user
1767 instaweb.browser
1768 instaweb.httpd
1769 instaweb.local
1770 instaweb.modulepath
1771 instaweb.port
1772 interactive.singlekey
1773 log.date
1774 log.showroot
1775 mailmap.file
1776 man.
1777 man.viewer
1778 merge.conflictstyle
1779 merge.log
1780 merge.renameLimit
1781 merge.stat
1782 merge.tool
1783 merge.verbosity
1784 mergetool.
1785 mergetool.keepBackup
1786 mergetool.prompt
1787 pack.compression
1788 pack.deltaCacheLimit
1789 pack.deltaCacheSize
1790 pack.depth
1791 pack.indexVersion
1792 pack.packSizeLimit
1793 pack.threads
1794 pack.window
1795 pack.windowMemory
1796 pager.
1797 pull.octopus
1798 pull.twohead
1799 push.default
1800 rebase.stat
1801 receive.denyCurrentBranch
1802 receive.denyDeletes
1803 receive.denyNonFastForwards
1804 receive.fsckObjects
1805 receive.unpackLimit
1806 repack.usedeltabaseoffset
1807 rerere.autoupdate
1808 rerere.enabled
1809 sendemail.aliasesfile
1810 sendemail.aliasesfiletype
1811 sendemail.bcc
1812 sendemail.cc
1813 sendemail.cccmd
1814 sendemail.chainreplyto
1815 sendemail.confirm
1816 sendemail.envelopesender
1817 sendemail.multiedit
1818 sendemail.signedoffbycc
1819 sendemail.smtpencryption
1820 sendemail.smtppass
1821 sendemail.smtpserver
1822 sendemail.smtpserverport
1823 sendemail.smtpuser
1824 sendemail.suppresscc
1825 sendemail.suppressfrom
1826 sendemail.thread
1827 sendemail.to
1828 sendemail.validate
1829 showbranch.default
1830 status.relativePaths
1831 status.showUntrackedFiles
1832 tar.umask
1833 transfer.unpackLimit
1834 url.
1835 user.email
1836 user.name
1837 user.signingkey
1838 web.browser
1839 branch. remote.
1840 "
1841}
1842
1843_git_remote ()
1844{
1845 local subcommands="add rename rm show prune update set-head"
1846 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1847 if [ -z "$subcommand" ]; then
1848 __gitcomp "$subcommands"
1849 return
1850 fi
1851
1852 case "$subcommand" in
1853 rename|rm|show|prune)
1854 __gitcomp "$(__git_remotes)"
1855 ;;
1856 update)
1857 local i c='' IFS=$'\n'
1858 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "remotes\..*" 2>/dev/null); do
1859 i="${i#remotes.}"
1860 c="$c ${i/ */}"
1861 done
1862 __gitcomp "$c"
1863 ;;
1864 *)
1865 COMPREPLY=()
1866 ;;
1867 esac
1868}
1869
1870_git_replace ()
1871{
1872 __gitcomp "$(__git_refs)"
1873}
1874
1875_git_reset ()
1876{
1877 __git_has_doubledash && return
1878
1879 local cur="${COMP_WORDS[COMP_CWORD]}"
1880 case "$cur" in
1881 --*)
1882 __gitcomp "--merge --mixed --hard --soft --patch"
1883 return
1884 ;;
1885 esac
1886 __gitcomp "$(__git_refs)"
1887}
1888
1889_git_revert ()
1890{
1891 local cur="${COMP_WORDS[COMP_CWORD]}"
1892 case "$cur" in
1893 --*)
1894 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
1895 return
1896 ;;
1897 esac
1898 __gitcomp "$(__git_refs)"
1899}
1900
1901_git_rm ()
1902{
1903 __git_has_doubledash && return
1904
1905 local cur="${COMP_WORDS[COMP_CWORD]}"
1906 case "$cur" in
1907 --*)
1908 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1909 return
1910 ;;
1911 esac
1912 COMPREPLY=()
1913}
1914
1915_git_shortlog ()
1916{
1917 __git_has_doubledash && return
1918
1919 local cur="${COMP_WORDS[COMP_CWORD]}"
1920 case "$cur" in
1921 --*)
1922 __gitcomp "
1923 $__git_log_common_options
1924 $__git_log_shortlog_options
1925 --numbered --summary
1926 "
1927 return
1928 ;;
1929 esac
1930 __git_complete_revlist
1931}
1932
1933_git_show ()
1934{
1935 __git_has_doubledash && return
1936
1937 local cur="${COMP_WORDS[COMP_CWORD]}"
1938 case "$cur" in
1939 --pretty=*)
1940 __gitcomp "$__git_log_pretty_formats
1941 " "" "${cur##--pretty=}"
1942 return
1943 ;;
1944 --format=*)
1945 __gitcomp "$__git_log_pretty_formats
1946 " "" "${cur##--format=}"
1947 return
1948 ;;
1949 --*)
1950 __gitcomp "--pretty= --format= --abbrev-commit --oneline
1951 $__git_diff_common_options
1952 "
1953 return
1954 ;;
1955 esac
1956 __git_complete_file
1957}
1958
1959_git_show_branch ()
1960{
1961 local cur="${COMP_WORDS[COMP_CWORD]}"
1962 case "$cur" in
1963 --*)
1964 __gitcomp "
1965 --all --remotes --topo-order --current --more=
1966 --list --independent --merge-base --no-name
1967 --color --no-color
1968 --sha1-name --sparse --topics --reflog
1969 "
1970 return
1971 ;;
1972 esac
1973 __git_complete_revlist
1974}
1975
1976_git_stash ()
1977{
1978 local cur="${COMP_WORDS[COMP_CWORD]}"
1979 local save_opts='--keep-index --no-keep-index --quiet --patch'
1980 local subcommands='save list show apply clear drop pop create branch'
1981 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1982 if [ -z "$subcommand" ]; then
1983 case "$cur" in
1984 --*)
1985 __gitcomp "$save_opts"
1986 ;;
1987 *)
1988 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
1989 __gitcomp "$subcommands"
1990 else
1991 COMPREPLY=()
1992 fi
1993 ;;
1994 esac
1995 else
1996 case "$subcommand,$cur" in
1997 save,--*)
1998 __gitcomp "$save_opts"
1999 ;;
2000 apply,--*|pop,--*)
2001 __gitcomp "--index --quiet"
2002 ;;
2003 show,--*|drop,--*|branch,--*)
2004 COMPREPLY=()
2005 ;;
2006 show,*|apply,*|drop,*|pop,*|branch,*)
2007 __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
2008 | sed -n -e 's/:.*//p')"
2009 ;;
2010 *)
2011 COMPREPLY=()
2012 ;;
2013 esac
2014 fi
2015}
2016
2017_git_submodule ()
2018{
2019 __git_has_doubledash && return
2020
2021 local subcommands="add status init update summary foreach sync"
2022 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2023 local cur="${COMP_WORDS[COMP_CWORD]}"
2024 case "$cur" in
2025 --*)
2026 __gitcomp "--quiet --cached"
2027 ;;
2028 *)
2029 __gitcomp "$subcommands"
2030 ;;
2031 esac
2032 return
2033 fi
2034}
2035
2036_git_svn ()
2037{
2038 local subcommands="
2039 init fetch clone rebase dcommit log find-rev
2040 set-tree commit-diff info create-ignore propget
2041 proplist show-ignore show-externals branch tag blame
2042 migrate mkdirs reset gc
2043 "
2044 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2045 if [ -z "$subcommand" ]; then
2046 __gitcomp "$subcommands"
2047 else
2048 local remote_opts="--username= --config-dir= --no-auth-cache"
2049 local fc_opts="
2050 --follow-parent --authors-file= --repack=
2051 --no-metadata --use-svm-props --use-svnsync-props
2052 --log-window-size= --no-checkout --quiet
2053 --repack-flags --use-log-author --localtime
2054 --ignore-paths= $remote_opts
2055 "
2056 local init_opts="
2057 --template= --shared= --trunk= --tags=
2058 --branches= --stdlayout --minimize-url
2059 --no-metadata --use-svm-props --use-svnsync-props
2060 --rewrite-root= --prefix= --use-log-author
2061 --add-author-from $remote_opts
2062 "
2063 local cmt_opts="
2064 --edit --rmdir --find-copies-harder --copy-similarity=
2065 "
2066
2067 local cur="${COMP_WORDS[COMP_CWORD]}"
2068 case "$subcommand,$cur" in
2069 fetch,--*)
2070 __gitcomp "--revision= --fetch-all $fc_opts"
2071 ;;
2072 clone,--*)
2073 __gitcomp "--revision= $fc_opts $init_opts"
2074 ;;
2075 init,--*)
2076 __gitcomp "$init_opts"
2077 ;;
2078 dcommit,--*)
2079 __gitcomp "
2080 --merge --strategy= --verbose --dry-run
2081 --fetch-all --no-rebase --commit-url
2082 --revision $cmt_opts $fc_opts
2083 "
2084 ;;
2085 set-tree,--*)
2086 __gitcomp "--stdin $cmt_opts $fc_opts"
2087 ;;
2088 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
2089 show-externals,--*|mkdirs,--*)
2090 __gitcomp "--revision="
2091 ;;
2092 log,--*)
2093 __gitcomp "
2094 --limit= --revision= --verbose --incremental
2095 --oneline --show-commit --non-recursive
2096 --authors-file= --color
2097 "
2098 ;;
2099 rebase,--*)
2100 __gitcomp "
2101 --merge --verbose --strategy= --local
2102 --fetch-all --dry-run $fc_opts
2103 "
2104 ;;
2105 commit-diff,--*)
2106 __gitcomp "--message= --file= --revision= $cmt_opts"
2107 ;;
2108 info,--*)
2109 __gitcomp "--url"
2110 ;;
2111 branch,--*)
2112 __gitcomp "--dry-run --message --tag"
2113 ;;
2114 tag,--*)
2115 __gitcomp "--dry-run --message"
2116 ;;
2117 blame,--*)
2118 __gitcomp "--git-format"
2119 ;;
2120 migrate,--*)
2121 __gitcomp "
2122 --config-dir= --ignore-paths= --minimize
2123 --no-auth-cache --username=
2124 "
2125 ;;
2126 reset,--*)
2127 __gitcomp "--revision= --parent"
2128 ;;
2129 *)
2130 COMPREPLY=()
2131 ;;
2132 esac
2133 fi
2134}
2135
2136_git_tag ()
2137{
2138 local i c=1 f=0
2139 while [ $c -lt $COMP_CWORD ]; do
2140 i="${COMP_WORDS[c]}"
2141 case "$i" in
2142 -d|-v)
2143 __gitcomp "$(__git_tags)"
2144 return
2145 ;;
2146 -f)
2147 f=1
2148 ;;
2149 esac
2150 c=$((++c))
2151 done
2152
2153 case "${COMP_WORDS[COMP_CWORD-1]}" in
2154 -m|-F)
2155 COMPREPLY=()
2156 ;;
2157 -*|tag)
2158 if [ $f = 1 ]; then
2159 __gitcomp "$(__git_tags)"
2160 else
2161 COMPREPLY=()
2162 fi
2163 ;;
2164 *)
2165 __gitcomp "$(__git_refs)"
2166 ;;
2167 esac
2168}
2169
2170_git ()
2171{
2172 local i c=1 command __git_dir
2173
2174 while [ $c -lt $COMP_CWORD ]; do
2175 i="${COMP_WORDS[c]}"
2176 case "$i" in
2177 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2178 --bare) __git_dir="." ;;
2179 --version|-p|--paginate) ;;
2180 --help) command="help"; break ;;
2181 *) command="$i"; break ;;
2182 esac
2183 c=$((++c))
2184 done
2185
2186 if [ -z "$command" ]; then
2187 case "${COMP_WORDS[COMP_CWORD]}" in
2188 --*) __gitcomp "
2189 --paginate
2190 --no-pager
2191 --git-dir=
2192 --bare
2193 --version
2194 --exec-path
2195 --html-path
2196 --work-tree=
2197 --help
2198 "
2199 ;;
2200 *) __git_compute_porcelain_commands
2201 __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
2202 esac
2203 return
2204 fi
2205
2206 local expansion=$(__git_aliased_command "$command")
2207 [ "$expansion" ] && command="$expansion"
2208
2209 case "$command" in
2210 am) _git_am ;;
2211 add) _git_add ;;
2212 apply) _git_apply ;;
2213 archive) _git_archive ;;
2214 bisect) _git_bisect ;;
2215 bundle) _git_bundle ;;
2216 branch) _git_branch ;;
2217 checkout) _git_checkout ;;
2218 cherry) _git_cherry ;;
2219 cherry-pick) _git_cherry_pick ;;
2220 clean) _git_clean ;;
2221 clone) _git_clone ;;
2222 commit) _git_commit ;;
2223 config) _git_config ;;
2224 describe) _git_describe ;;
2225 diff) _git_diff ;;
2226 difftool) _git_difftool ;;
2227 fetch) _git_fetch ;;
2228 format-patch) _git_format_patch ;;
2229 fsck) _git_fsck ;;
2230 gc) _git_gc ;;
2231 grep) _git_grep ;;
2232 help) _git_help ;;
2233 init) _git_init ;;
2234 log) _git_log ;;
2235 ls-files) _git_ls_files ;;
2236 ls-remote) _git_ls_remote ;;
2237 ls-tree) _git_ls_tree ;;
2238 merge) _git_merge;;
2239 mergetool) _git_mergetool;;
2240 merge-base) _git_merge_base ;;
2241 mv) _git_mv ;;
2242 name-rev) _git_name_rev ;;
2243 notes) _git_notes ;;
2244 pull) _git_pull ;;
2245 push) _git_push ;;
2246 rebase) _git_rebase ;;
2247 remote) _git_remote ;;
2248 replace) _git_replace ;;
2249 reset) _git_reset ;;
2250 revert) _git_revert ;;
2251 rm) _git_rm ;;
2252 send-email) _git_send_email ;;
2253 shortlog) _git_shortlog ;;
2254 show) _git_show ;;
2255 show-branch) _git_show_branch ;;
2256 stash) _git_stash ;;
2257 stage) _git_add ;;
2258 submodule) _git_submodule ;;
2259 svn) _git_svn ;;
2260 tag) _git_tag ;;
2261 whatchanged) _git_log ;;
2262 *) COMPREPLY=() ;;
2263 esac
2264}
2265
2266_gitk ()
2267{
2268 __git_has_doubledash && return
2269
2270 local cur="${COMP_WORDS[COMP_CWORD]}"
2271 local g="$(__gitdir)"
2272 local merge=""
2273 if [ -f "$g/MERGE_HEAD" ]; then
2274 merge="--merge"
2275 fi
2276 case "$cur" in
2277 --*)
2278 __gitcomp "
2279 $__git_log_common_options
2280 $__git_log_gitk_options
2281 $merge
2282 "
2283 return
2284 ;;
2285 esac
2286 __git_complete_revlist
2287}
2288
2289complete -o bashdefault -o default -o nospace -F _git git 2>/dev/null \
2290 || complete -o default -o nospace -F _git git
2291complete -o bashdefault -o default -o nospace -F _gitk gitk 2>/dev/null \
2292 || complete -o default -o nospace -F _gitk gitk
2293
2294# The following are necessary only for Cygwin, and only are needed
2295# when the user has tab-completed the executable name and consequently
2296# included the '.exe' suffix.
2297#
2298if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
2299complete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \
2300 || complete -o default -o nospace -F _git git.exe
2301fi