3 # bash completion support for core Git.
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.
9 # The contained completion routines provide support for completing:
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
18 # To use these routines:
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
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.
30 # 4) Consider changing your PS1 to also show the current branch:
31 # PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
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.
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.
45 # *) Read Documentation/SubmittingPatches
46 # *) Send all patches to the current maintainer:
48 # "Shawn O. Pearce" <spearce@spearce.org>
50 # *) Always CC the Git mailing list:
55 case "$COMP_WORDBREAKS" in
57 *) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
60 # __gitdir accepts 0 or 1 arguments (i.e., location)
61 # returns location of .git repo
64 if [ -z "${1-}" ]; then
65 if [ -n "${__git_dir-}" ]; then
67 elif [ -d .git ]; then
70 git rev-parse --git-dir 2>/dev/null
72 elif [ -d "$1/.git" ]; then
79 # __git_ps1 accepts 0 or 1 arguments (i.e., format string)
80 # returns text to add to bash PS1 prompt (includes branch name)
87 if [ -d "$g/rebase-apply" ]; then
88 if [ -f "$g/rebase-apply/rebasing" ]; then
90 elif [ -f "$g/rebase-apply/applying" ]; then
95 b="$(git symbolic-ref HEAD 2>/dev/null)"
96 elif [ -f "$g/rebase-merge/interactive" ]; then
98 b="$(cat "$g/rebase-merge/head-name")"
99 elif [ -d "$g/rebase-merge" ]; then
101 b="$(cat "$g/rebase-merge/head-name")"
102 elif [ -f "$g/MERGE_HEAD" ]; then
104 b="$(git symbolic-ref HEAD 2>/dev/null)"
106 if [ -f "$g/BISECT_LOG" ]; then
109 if ! b="$(git symbolic-ref HEAD 2>/dev/null)"; then
110 if ! b="$(git describe --exact-match HEAD 2>/dev/null)"; then
111 if [ -r "$g/HEAD" ]; then
112 b="$(cut -c1-7 "$g/HEAD")..."
122 if [ "true" = "$(git rev-parse --is-inside-git-dir 2>/dev/null)" ]; then
123 if [ "true" = "$(git config --bool core.bare 2>/dev/null)" ]; then
128 elif [ "true" = "$(git rev-parse --is-inside-work-tree 2>/dev/null)" ]; then
129 if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ]; then
130 if [ "$(git config --bool bash.showDirtyState)" != "false" ]; then
131 git diff --no-ext-diff --ignore-submodules \
132 --quiet --exit-code || w="*"
133 if git rev-parse --quiet --verify HEAD >/dev/null; then
134 git diff-index --cached --quiet \
135 --ignore-submodules HEAD -- || i="+"
144 if [ -n "${1-}" ]; then
145 printf "$1" "$c${b##refs/heads/}$w$i$r"
147 printf " (%s)" "$c${b##refs/heads/}$w$i$r"
153 # __gitcomp_1 requires 2 arguments
156 local c IFS=' '$'\t'$'\n'
159 --*=*) printf %s$'\n' "$c$2" ;;
160 *.) printf %s$'\n' "$c$2" ;;
161 *) printf %s$'\n' "$c$2 " ;;
166 # __gitcomp accepts 1, 2, 3, or 4 arguments
167 # generates completion reply with compgen
170 local cur="${COMP_WORDS[COMP_CWORD]}"
171 if [ $# -gt 2 ]; then
180 COMPREPLY=($(compgen -P "${2-}" \
181 -W "$(__gitcomp_1 "${1-}" "${4-}")" \
187 # __git_heads accepts 0 or 1 arguments (to pass to __gitdir)
190 local cmd i is_hash=y dir="$(__gitdir "${1-}")"
191 if [ -d "$dir" ]; then
192 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
196 for i in $(git ls-remote "${1-}" 2>/dev/null); do
197 case "$is_hash,$i" in
200 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
201 n,*) is_hash=y; echo "$i" ;;
206 # __git_tags accepts 0 or 1 arguments (to pass to __gitdir)
209 local cmd i is_hash=y dir="$(__gitdir "${1-}")"
210 if [ -d "$dir" ]; then
211 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
215 for i in $(git ls-remote "${1-}" 2>/dev/null); do
216 case "$is_hash,$i" in
219 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
220 n,*) is_hash=y; echo "$i" ;;
225 # __git_refs accepts 0 or 1 arguments (to pass to __gitdir)
228 local i is_hash=y dir="$(__gitdir "${1-}")"
229 local cur="${COMP_WORDS[COMP_CWORD]}" format refs
230 if [ -d "$dir" ]; then
237 if [ -e "$dir/HEAD" ]; then echo HEAD; fi
238 format="refname:short"
239 refs="refs/tags refs/heads refs/remotes"
242 git --git-dir="$dir" for-each-ref --format="%($format)" \
246 for i in $(git ls-remote "$dir" 2>/dev/null); do
247 case "$is_hash,$i" in
250 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
251 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
252 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
253 n,*) is_hash=y; echo "$i" ;;
258 # __git_refs2 requires 1 argument (to pass to __git_refs)
262 for i in $(__git_refs "$1"); do
267 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
268 __git_refs_remotes ()
270 local cmd i is_hash=y
271 for i in $(git ls-remote "$1" 2>/dev/null); do
272 case "$is_hash,$i" in
275 echo "$i:refs/remotes/$1/${i#refs/heads/}"
279 n,refs/tags/*) is_hash=y;;
287 local i ngoff IFS=$'\n' d="$(__gitdir)"
288 shopt -q nullglob || ngoff=1
290 for i in "$d/remotes"/*; do
291 echo ${i#$d/remotes/}
293 [ "$ngoff" ] && shopt -u nullglob
294 for i in $(git --git-dir="$d" config --list); do
304 __git_merge_strategies ()
306 if [ -n "${__git_merge_strategylist-}" ]; then
307 echo "$__git_merge_strategylist"
310 git merge -s help 2>&1 |
311 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
319 __git_merge_strategylist=
320 __git_merge_strategylist=$(__git_merge_strategies 2>/dev/null)
322 __git_complete_file ()
324 local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
341 case "$COMP_WORDBREAKS" in
343 *) pfx="$ref:$pfx" ;;
347 COMPREPLY=($(compgen -P "$pfx" \
348 -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
349 | sed '/^100... blob /{
365 __gitcomp "$(__git_refs)"
370 __git_complete_revlist ()
372 local pfx cur="${COMP_WORDS[COMP_CWORD]}"
377 __gitcomp "$(__git_refs)" "$pfx" "$cur"
382 __gitcomp "$(__git_refs)" "$pfx" "$cur"
385 __gitcomp "$(__git_refs)"
390 __git_all_commands ()
392 if [ -n "${__git_all_commandlist-}" ]; then
393 echo "$__git_all_commandlist"
397 for i in $(git help -a|egrep '^ ')
400 *--*) : helper pattern;;
405 __git_all_commandlist=
406 __git_all_commandlist="$(__git_all_commands 2>/dev/null)"
408 __git_porcelain_commands ()
410 if [ -n "${__git_porcelain_commandlist-}" ]; then
411 echo "$__git_porcelain_commandlist"
415 for i in "help" $(__git_all_commands)
418 *--*) : helper pattern;;
419 applymbox) : ask gittus;;
420 applypatch) : ask gittus;;
421 archimport) : import;;
422 cat-file) : plumbing;;
423 check-attr) : plumbing;;
424 check-ref-format) : plumbing;;
425 checkout-index) : plumbing;;
426 commit-tree) : plumbing;;
427 count-objects) : infrequent;;
428 cvsexportcommit) : export;;
429 cvsimport) : import;;
430 cvsserver) : daemon;;
432 diff-files) : plumbing;;
433 diff-index) : plumbing;;
434 diff-tree) : plumbing;;
435 fast-import) : import;;
436 fast-export) : export;;
437 fsck-objects) : plumbing;;
438 fetch-pack) : plumbing;;
439 fmt-merge-msg) : plumbing;;
440 for-each-ref) : plumbing;;
441 hash-object) : plumbing;;
442 http-*) : transport;;
443 index-pack) : plumbing;;
444 init-db) : deprecated;;
445 local-fetch) : plumbing;;
446 lost-found) : infrequent;;
447 ls-files) : plumbing;;
448 ls-remote) : plumbing;;
449 ls-tree) : plumbing;;
450 mailinfo) : plumbing;;
451 mailsplit) : plumbing;;
452 merge-*) : plumbing;;
455 pack-objects) : plumbing;;
456 pack-redundant) : plumbing;;
457 pack-refs) : plumbing;;
458 parse-remote) : plumbing;;
459 patch-id) : plumbing;;
460 peek-remote) : plumbing;;
462 prune-packed) : plumbing;;
463 quiltimport) : import;;
464 read-tree) : plumbing;;
465 receive-pack) : plumbing;;
467 repo-config) : deprecated;;
469 rev-list) : plumbing;;
470 rev-parse) : plumbing;;
471 runstatus) : plumbing;;
472 sh-setup) : internal;;
474 show-ref) : plumbing;;
475 send-pack) : plumbing;;
476 show-index) : plumbing;;
478 stripspace) : plumbing;;
479 symbolic-ref) : plumbing;;
480 tar-tree) : deprecated;;
481 unpack-file) : plumbing;;
482 unpack-objects) : plumbing;;
483 update-index) : plumbing;;
484 update-ref) : plumbing;;
485 update-server-info) : daemon;;
486 upload-archive) : plumbing;;
487 upload-pack) : plumbing;;
488 write-tree) : plumbing;;
490 verify-pack) : infrequent;;
491 verify-tag) : plumbing;;
496 __git_porcelain_commandlist=
497 __git_porcelain_commandlist="$(__git_porcelain_commands 2>/dev/null)"
502 for i in $(git --git-dir="$(__gitdir)" config --list); do
512 # __git_aliased_command requires 1 argument
513 __git_aliased_command ()
515 local word cmdline=$(git --git-dir="$(__gitdir)" \
516 config --get "alias.$1")
517 for word in $cmdline; do
518 if [ "${word##-*}" ]; then
525 # __git_find_subcommand requires 1 argument
526 __git_find_subcommand ()
528 local word subcommand c=1
530 while [ $c -lt $COMP_CWORD ]; do
531 word="${COMP_WORDS[c]}"
532 for subcommand in $1; do
533 if [ "$subcommand" = "$word" ]; then
542 __git_has_doubledash ()
545 while [ $c -lt $COMP_CWORD ]; do
546 if [ "--" = "${COMP_WORDS[c]}" ]; then
554 __git_whitespacelist="nowarn warn error error-all fix"
558 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
559 if [ -d "$dir"/rebase-apply ]; then
560 __gitcomp "--skip --resolved --abort"
565 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
570 --signoff --utf8 --binary --3way --interactive
580 local cur="${COMP_WORDS[COMP_CWORD]}"
583 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
588 --stat --numstat --summary --check --index
589 --cached --index-info --reverse --reject --unidiff-zero
590 --apply --no-add --exclude=
591 --whitespace= --inaccurate-eof --verbose
600 __git_has_doubledash && return
602 local cur="${COMP_WORDS[COMP_CWORD]}"
606 --interactive --refresh --patch --update --dry-run
607 --ignore-errors --intent-to-add
616 local cur="${COMP_WORDS[COMP_CWORD]}"
619 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
623 __gitcomp "$(__git_remotes)" "" "${cur##--remote=}"
628 --format= --list --verbose
629 --prefix= --remote= --exec=
639 __git_has_doubledash && return
641 local subcommands="start bad good skip reset visualize replay log run"
642 local subcommand="$(__git_find_subcommand "$subcommands")"
643 if [ -z "$subcommand" ]; then
644 __gitcomp "$subcommands"
648 case "$subcommand" in
650 __gitcomp "$(__git_refs)"
660 local i c=1 only_local_ref="n" has_r="n"
662 while [ $c -lt $COMP_CWORD ]; do
665 -d|-m) only_local_ref="y" ;;
671 case "${COMP_WORDS[COMP_CWORD]}" in
674 --color --no-color --verbose --abbrev= --no-abbrev
675 --track --no-track --contains --merged --no-merged
679 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
680 __gitcomp "$(__git_heads)"
682 __gitcomp "$(__git_refs)"
690 local cmd="${COMP_WORDS[2]}"
691 case "$COMP_CWORD" in
693 __gitcomp "create list-heads verify unbundle"
701 __git_complete_revlist
710 __git_has_doubledash && return
712 __gitcomp "$(__git_refs)"
717 __gitcomp "$(__git_refs)"
722 local cur="${COMP_WORDS[COMP_CWORD]}"
725 __gitcomp "--edit --no-commit"
728 __gitcomp "$(__git_refs)"
735 __git_has_doubledash && return
737 local cur="${COMP_WORDS[COMP_CWORD]}"
740 __gitcomp "--dry-run --quiet"
749 local cur="${COMP_WORDS[COMP_CWORD]}"
774 __git_has_doubledash && return
776 local cur="${COMP_WORDS[COMP_CWORD]}"
780 --all --author= --signoff --verify --no-verify
781 --edit --amend --include --only --interactive
790 local cur="${COMP_WORDS[COMP_CWORD]}"
794 --all --tags --contains --abbrev= --candidates=
795 --exact-match --debug --long --match --always
799 __gitcomp "$(__git_refs)"
802 __git_diff_common_options="--stat --numstat --shortstat --summary
803 --patch-with-stat --name-only --name-status --color
804 --no-color --color-words --no-renames --check
805 --full-index --binary --abbrev --diff-filter=
807 --text --ignore-space-at-eol --ignore-space-change
808 --ignore-all-space --exit-code --quiet --ext-diff
810 --no-prefix --src-prefix= --dst-prefix=
811 --inter-hunk-context=
818 __git_has_doubledash && return
820 local cur="${COMP_WORDS[COMP_CWORD]}"
823 __gitcomp "--cached --pickaxe-all --pickaxe-regex
824 --base --ours --theirs
825 $__git_diff_common_options
835 local cur="${COMP_WORDS[COMP_CWORD]}"
837 if [ "$COMP_CWORD" = 2 ]; then
838 __gitcomp "$(__git_remotes)"
843 case "$COMP_WORDBREAKS" in
845 *) pfx="${cur%%:*}:" ;;
847 __gitcomp "$(__git_refs)" "$pfx" "${cur#*:}"
850 __gitcomp "$(__git_refs2 "${COMP_WORDS[2]}")"
858 local cur="${COMP_WORDS[COMP_CWORD]}"
862 --stdout --attach --thread
864 --numbered --start-number
869 --full-index --binary
872 --no-prefix --src-prefix= --dst-prefix=
873 --inline --suffix= --ignore-if-in-upstream
879 __git_complete_revlist
884 local cur="${COMP_WORDS[COMP_CWORD]}"
887 __gitcomp "--prune --aggressive"
896 __git_has_doubledash && return
898 local cur="${COMP_WORDS[COMP_CWORD]}"
903 --text --ignore-case --word-regexp --invert-match
905 --extended-regexp --basic-regexp --fixed-strings
906 --files-with-matches --name-only
907 --files-without-match
909 --and --or --not --all-match
919 local cur="${COMP_WORDS[COMP_CWORD]}"
922 __gitcomp "--all --info --man --web"
926 __gitcomp "$(__git_all_commands)
927 attributes cli core-tutorial cvs-migration
928 diffcore gitk glossary hooks ignore modules
929 repository-layout tutorial tutorial-2
936 local cur="${COMP_WORDS[COMP_CWORD]}"
940 false true umask group all world everybody
941 " "" "${cur##--shared=}"
945 __gitcomp "--quiet --bare --template= --shared --shared="
954 __git_has_doubledash && return
956 local cur="${COMP_WORDS[COMP_CWORD]}"
959 __gitcomp "--cached --deleted --modified --others --ignored
960 --stage --directory --no-empty-directory --unmerged
961 --killed --exclude= --exclude-from=
962 --exclude-per-directory= --exclude-standard
963 --error-unmatch --with-tree= --full-name
964 --abbrev --ignored --exclude-per-directory
974 __gitcomp "$(__git_remotes)"
982 # Options that go well for log, shortlog and gitk
983 __git_log_common_options="
985 --branches --tags --remotes
986 --first-parent --no-merges
988 --max-age= --since= --after=
989 --min-age= --until= --before=
991 # Options that go well for log and gitk (not shortlog)
992 __git_log_gitk_options="
993 --dense --sparse --full-history
994 --simplify-merges --simplify-by-decoration
997 # Options that go well for log and shortlog (not gitk)
998 __git_log_shortlog_options="
999 --author= --committer= --grep=
1003 __git_log_pretty_formats="oneline short medium full fuller email raw format:"
1007 __git_has_doubledash && return
1009 local cur="${COMP_WORDS[COMP_CWORD]}"
1010 local g="$(git rev-parse --git-dir 2>/dev/null)"
1012 if [ -f $g/MERGE_HEAD ]; then
1017 __gitcomp "$__git_log_pretty_formats
1018 " "" "${cur##--pretty=}"
1022 __gitcomp "$__git_log_pretty_formats
1023 " "" "${cur##--format=}"
1028 relative iso8601 rfc2822 short local default
1029 " "" "${cur##--date=}"
1034 $__git_log_common_options
1035 $__git_log_shortlog_options
1036 $__git_log_gitk_options
1037 --root --topo-order --date-order --reverse
1039 --abbrev-commit --abbrev=
1040 --relative-date --date=
1041 --pretty= --format= --oneline
1046 --parents --children
1048 $__git_diff_common_options
1049 --pickaxe-all --pickaxe-regex
1054 __git_complete_revlist
1059 local cur="${COMP_WORDS[COMP_CWORD]}"
1060 case "${COMP_WORDS[COMP_CWORD-1]}" in
1062 __gitcomp "$(__git_merge_strategies)"
1067 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
1072 --no-commit --no-stat --log --no-log --squash --strategy
1073 --commit --stat --no-squash --ff --no-ff
1077 __gitcomp "$(__git_refs)"
1082 local cur="${COMP_WORDS[COMP_CWORD]}"
1086 kdiff3 tkdiff meld xxdiff emerge
1087 vimdiff gvimdiff ecmerge opendiff
1088 " "" "${cur##--tool=}"
1101 __gitcomp "$(__git_refs)"
1106 local cur="${COMP_WORDS[COMP_CWORD]}"
1109 __gitcomp "--dry-run"
1118 __gitcomp "--tags --all --stdin"
1123 local cur="${COMP_WORDS[COMP_CWORD]}"
1125 if [ "$COMP_CWORD" = 2 ]; then
1126 __gitcomp "$(__git_remotes)"
1128 __gitcomp "$(__git_refs "${COMP_WORDS[2]}")"
1134 local cur="${COMP_WORDS[COMP_CWORD]}"
1136 if [ "$COMP_CWORD" = 2 ]; then
1137 __gitcomp "$(__git_remotes)"
1142 case "$COMP_WORDBREAKS" in
1144 *) pfx="${cur%%:*}:" ;;
1147 __gitcomp "$(__git_refs "${COMP_WORDS[2]}")" "$pfx" "${cur#*:}"
1150 __gitcomp "$(__git_refs)" + "${cur#+}"
1153 __gitcomp "$(__git_refs)"
1161 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
1162 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1163 __gitcomp "--continue --skip --abort"
1166 case "${COMP_WORDS[COMP_CWORD-1]}" in
1168 __gitcomp "$(__git_merge_strategies)"
1173 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
1177 __gitcomp "--onto --merge --strategy --interactive"
1180 __gitcomp "$(__git_refs)"
1185 local cur="${COMP_WORDS[COMP_CWORD]}"
1188 __gitcomp "--bcc --cc --cc-cmd --chain-reply-to --compose
1189 --dry-run --envelope-sender --from --identity
1190 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1191 --no-suppress-from --no-thread --quiet
1192 --signed-off-by-cc --smtp-pass --smtp-server
1193 --smtp-server-port --smtp-ssl --smtp-user --subject
1194 --suppress-cc --suppress-from --thread --to
1195 --validate --no-validate"
1204 local cur="${COMP_WORDS[COMP_CWORD]}"
1205 local prv="${COMP_WORDS[COMP_CWORD-1]}"
1208 __gitcomp "$(__git_remotes)"
1212 __gitcomp "$(__git_refs)"
1216 local remote="${prv#remote.}"
1217 remote="${remote%.fetch}"
1218 __gitcomp "$(__git_refs_remotes "$remote")"
1222 local remote="${prv#remote.}"
1223 remote="${remote%.push}"
1224 __gitcomp "$(git --git-dir="$(__gitdir)" \
1225 for-each-ref --format='%(refname):%(refname)' \
1229 pull.twohead|pull.octopus)
1230 __gitcomp "$(__git_merge_strategies)"
1233 color.branch|color.diff|color.interactive|color.status|color.ui)
1234 __gitcomp "always never auto"
1238 __gitcomp "false true"
1243 normal black red green yellow blue magenta cyan white
1244 bold dim ul blink reverse
1256 --global --system --file=
1257 --list --replace-all
1258 --get --get-all --get-regexp
1259 --add --unset --unset-all
1260 --remove-section --rename-section
1265 local pfx="${cur%.*}."
1267 __gitcomp "remote merge mergeoptions" "$pfx" "$cur"
1271 local pfx="${cur%.*}."
1273 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1277 local pfx="${cur%.*}."
1280 url proxy fetch push mirror skipDefaultUpdate
1281 receivepack uploadpack tagopt
1286 local pfx="${cur%.*}."
1288 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1294 branch.autosetupmerge
1295 branch.autosetuprebase
1298 color.branch.current
1309 color.diff.whitespace
1311 color.interactive.header
1312 color.interactive.help
1313 color.interactive.prompt
1317 color.status.changed
1319 color.status.nobranch
1320 color.status.untracked
1321 color.status.updated
1327 core.deltaBaseCacheLimit
1331 core.fsyncobjectfiles
1333 core.ignoreCygwinFSTricks
1335 core.logAllRefUpdates
1336 core.loosecompression
1338 core.packedGitWindowSize
1340 core.preferSymlinkRefs
1343 core.repositoryFormatVersion
1345 core.sharedRepository
1348 core.warnAmbiguousRefs
1351 diff.autorefreshindex
1368 gc.reflogexpireunreachable
1372 gitcvs.dbTableNamePrefix
1382 gui.copyblamethreshold
1386 gui.matchtrackingbranch
1387 gui.newbranchtemplate
1388 gui.pruneduringfetch
1389 gui.spellingdictionary
1405 i18n.logOutputEncoding
1420 mergetool.keepBackup
1422 pack.deltaCacheLimit
1432 receive.denyCurrentBranch
1434 receive.denyNonFastForwards
1437 repack.usedeltabaseoffset
1441 status.relativePaths
1442 status.showUntrackedFiles
1444 transfer.unpackLimit
1455 local subcommands="add rename rm show prune update set-head"
1456 local subcommand="$(__git_find_subcommand "$subcommands")"
1457 if [ -z "$subcommand" ]; then
1458 __gitcomp "$subcommands"
1462 case "$subcommand" in
1463 rename|rm|show|prune)
1464 __gitcomp "$(__git_remotes)"
1467 local i c='' IFS=$'\n'
1468 for i in $(git --git-dir="$(__gitdir)" config --list); do
1486 __git_has_doubledash && return
1488 local cur="${COMP_WORDS[COMP_CWORD]}"
1491 __gitcomp "--merge --mixed --hard --soft"
1495 __gitcomp "$(__git_refs)"
1500 local cur="${COMP_WORDS[COMP_CWORD]}"
1503 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
1507 __gitcomp "$(__git_refs)"
1512 __git_has_doubledash && return
1514 local cur="${COMP_WORDS[COMP_CWORD]}"
1517 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1526 __git_has_doubledash && return
1528 local cur="${COMP_WORDS[COMP_CWORD]}"
1532 $__git_log_common_options
1533 $__git_log_shortlog_options
1534 --numbered --summary
1539 __git_complete_revlist
1544 __git_has_doubledash && return
1546 local cur="${COMP_WORDS[COMP_CWORD]}"
1549 __gitcomp "$__git_log_pretty_formats
1550 " "" "${cur##--pretty=}"
1554 __gitcomp "$__git_log_pretty_formats
1555 " "" "${cur##--format=}"
1559 __gitcomp "--pretty= --format=
1560 $__git_diff_common_options
1570 local cur="${COMP_WORDS[COMP_CWORD]}"
1574 --all --remotes --topo-order --current --more=
1575 --list --independent --merge-base --no-name
1576 --sha1-name --topics --reflog
1581 __git_complete_revlist
1586 local subcommands='save list show apply clear drop pop create branch'
1587 local subcommand="$(__git_find_subcommand "$subcommands")"
1588 if [ -z "$subcommand" ]; then
1589 __gitcomp "$subcommands"
1591 local cur="${COMP_WORDS[COMP_CWORD]}"
1592 case "$subcommand,$cur" in
1594 __gitcomp "--keep-index"
1599 show,--*|drop,--*|pop,--*|branch,--*)
1602 show,*|apply,*|drop,*|pop,*|branch,*)
1603 __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
1604 | sed -n -e 's/:.*//p')"
1615 __git_has_doubledash && return
1617 local subcommands="add status init update summary foreach sync"
1618 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1619 local cur="${COMP_WORDS[COMP_CWORD]}"
1622 __gitcomp "--quiet --cached"
1625 __gitcomp "$subcommands"
1635 init fetch clone rebase dcommit log find-rev
1636 set-tree commit-diff info create-ignore propget
1637 proplist show-ignore show-externals branch tag blame
1640 local subcommand="$(__git_find_subcommand "$subcommands")"
1641 if [ -z "$subcommand" ]; then
1642 __gitcomp "$subcommands"
1644 local remote_opts="--username= --config-dir= --no-auth-cache"
1646 --follow-parent --authors-file= --repack=
1647 --no-metadata --use-svm-props --use-svnsync-props
1648 --log-window-size= --no-checkout --quiet
1649 --repack-flags --use-log-author --localtime
1650 --ignore-paths= $remote_opts
1653 --template= --shared= --trunk= --tags=
1654 --branches= --stdlayout --minimize-url
1655 --no-metadata --use-svm-props --use-svnsync-props
1656 --rewrite-root= --prefix= --use-log-author
1657 --add-author-from $remote_opts
1660 --edit --rmdir --find-copies-harder --copy-similarity=
1663 local cur="${COMP_WORDS[COMP_CWORD]}"
1664 case "$subcommand,$cur" in
1666 __gitcomp "--revision= --fetch-all $fc_opts"
1669 __gitcomp "--revision= $fc_opts $init_opts"
1672 __gitcomp "$init_opts"
1676 --merge --strategy= --verbose --dry-run
1677 --fetch-all --no-rebase --commit-url
1678 --revision $cmt_opts $fc_opts
1682 __gitcomp "--stdin $cmt_opts $fc_opts"
1684 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1686 __gitcomp "--revision="
1690 --limit= --revision= --verbose --incremental
1691 --oneline --show-commit --non-recursive
1692 --authors-file= --color
1697 --merge --verbose --strategy= --local
1698 --fetch-all --dry-run $fc_opts
1702 __gitcomp "--message= --file= --revision= $cmt_opts"
1708 __gitcomp "--dry-run --message --tag"
1711 __gitcomp "--dry-run --message"
1714 __gitcomp "--git-format"
1718 --config-dir= --ignore-paths= --minimize
1719 --no-auth-cache --username=
1732 while [ $c -lt $COMP_CWORD ]; do
1733 i="${COMP_WORDS[c]}"
1736 __gitcomp "$(__git_tags)"
1746 case "${COMP_WORDS[COMP_CWORD-1]}" in
1752 __gitcomp "$(__git_tags)"
1758 __gitcomp "$(__git_refs)"
1765 local i c=1 command __git_dir
1767 while [ $c -lt $COMP_CWORD ]; do
1768 i="${COMP_WORDS[c]}"
1770 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1771 --bare) __git_dir="." ;;
1772 --version|-p|--paginate) ;;
1773 --help) command="help"; break ;;
1774 *) command="$i"; break ;;
1779 if [ -z "$command" ]; then
1780 case "${COMP_WORDS[COMP_CWORD]}" in
1792 *) __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
1797 local expansion=$(__git_aliased_command "$command")
1798 [ "$expansion" ] && command="$expansion"
1803 apply) _git_apply ;;
1804 archive) _git_archive ;;
1805 bisect) _git_bisect ;;
1806 bundle) _git_bundle ;;
1807 branch) _git_branch ;;
1808 checkout) _git_checkout ;;
1809 cherry) _git_cherry ;;
1810 cherry-pick) _git_cherry_pick ;;
1811 clean) _git_clean ;;
1812 clone) _git_clone ;;
1813 commit) _git_commit ;;
1814 config) _git_config ;;
1815 describe) _git_describe ;;
1817 fetch) _git_fetch ;;
1818 format-patch) _git_format_patch ;;
1824 ls-files) _git_ls_files ;;
1825 ls-remote) _git_ls_remote ;;
1826 ls-tree) _git_ls_tree ;;
1828 mergetool) _git_mergetool;;
1829 merge-base) _git_merge_base ;;
1831 name-rev) _git_name_rev ;;
1834 rebase) _git_rebase ;;
1835 remote) _git_remote ;;
1836 reset) _git_reset ;;
1837 revert) _git_revert ;;
1839 send-email) _git_send_email ;;
1840 shortlog) _git_shortlog ;;
1842 show-branch) _git_show_branch ;;
1843 stash) _git_stash ;;
1845 submodule) _git_submodule ;;
1848 whatchanged) _git_log ;;
1855 __git_has_doubledash && return
1857 local cur="${COMP_WORDS[COMP_CWORD]}"
1858 local g="$(__gitdir)"
1860 if [ -f $g/MERGE_HEAD ]; then
1866 $__git_log_common_options
1867 $__git_log_gitk_options
1873 __git_complete_revlist
1876 complete -o bashdefault -o default -o nospace -F _git git 2>/dev/null \
1877 || complete -o default -o nospace -F _git git
1878 complete -o bashdefault -o default -o nospace -F _gitk gitk 2>/dev/null \
1879 || complete -o default -o nospace -F _gitk gitk
1881 # The following are necessary only for Cygwin, and only are needed
1882 # when the user has tab-completed the executable name and consequently
1883 # included the '.exe' suffix.
1885 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1886 complete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \
1887 || complete -o default -o nospace -F _git git.exe