Code

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