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=}"
1023 relative iso8601 rfc2822 short local default
1024 " "" "${cur##--date=}"
1029 $__git_log_common_options
1030 $__git_log_shortlog_options
1031 $__git_log_gitk_options
1032 --root --topo-order --date-order --reverse
1034 --abbrev-commit --abbrev=
1035 --relative-date --date=
1041 --parents --children
1043 $__git_diff_common_options
1044 --pickaxe-all --pickaxe-regex
1049 __git_complete_revlist
1054 local cur="${COMP_WORDS[COMP_CWORD]}"
1055 case "${COMP_WORDS[COMP_CWORD-1]}" in
1057 __gitcomp "$(__git_merge_strategies)"
1062 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
1067 --no-commit --no-stat --log --no-log --squash --strategy
1068 --commit --stat --no-squash --ff --no-ff
1072 __gitcomp "$(__git_refs)"
1077 local cur="${COMP_WORDS[COMP_CWORD]}"
1081 kdiff3 tkdiff meld xxdiff emerge
1082 vimdiff gvimdiff ecmerge opendiff
1083 " "" "${cur##--tool=}"
1096 __gitcomp "$(__git_refs)"
1101 local cur="${COMP_WORDS[COMP_CWORD]}"
1104 __gitcomp "--dry-run"
1113 __gitcomp "--tags --all --stdin"
1118 local cur="${COMP_WORDS[COMP_CWORD]}"
1120 if [ "$COMP_CWORD" = 2 ]; then
1121 __gitcomp "$(__git_remotes)"
1123 __gitcomp "$(__git_refs "${COMP_WORDS[2]}")"
1129 local cur="${COMP_WORDS[COMP_CWORD]}"
1131 if [ "$COMP_CWORD" = 2 ]; then
1132 __gitcomp "$(__git_remotes)"
1137 case "$COMP_WORDBREAKS" in
1139 *) pfx="${cur%%:*}:" ;;
1142 __gitcomp "$(__git_refs "${COMP_WORDS[2]}")" "$pfx" "${cur#*:}"
1145 __gitcomp "$(__git_refs)" + "${cur#+}"
1148 __gitcomp "$(__git_refs)"
1156 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
1157 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1158 __gitcomp "--continue --skip --abort"
1161 case "${COMP_WORDS[COMP_CWORD-1]}" in
1163 __gitcomp "$(__git_merge_strategies)"
1168 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
1172 __gitcomp "--onto --merge --strategy --interactive"
1175 __gitcomp "$(__git_refs)"
1180 local cur="${COMP_WORDS[COMP_CWORD]}"
1183 __gitcomp "--bcc --cc --cc-cmd --chain-reply-to --compose
1184 --dry-run --envelope-sender --from --identity
1185 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1186 --no-suppress-from --no-thread --quiet
1187 --signed-off-by-cc --smtp-pass --smtp-server
1188 --smtp-server-port --smtp-ssl --smtp-user --subject
1189 --suppress-cc --suppress-from --thread --to
1190 --validate --no-validate"
1199 local cur="${COMP_WORDS[COMP_CWORD]}"
1200 local prv="${COMP_WORDS[COMP_CWORD-1]}"
1203 __gitcomp "$(__git_remotes)"
1207 __gitcomp "$(__git_refs)"
1211 local remote="${prv#remote.}"
1212 remote="${remote%.fetch}"
1213 __gitcomp "$(__git_refs_remotes "$remote")"
1217 local remote="${prv#remote.}"
1218 remote="${remote%.push}"
1219 __gitcomp "$(git --git-dir="$(__gitdir)" \
1220 for-each-ref --format='%(refname):%(refname)' \
1224 pull.twohead|pull.octopus)
1225 __gitcomp "$(__git_merge_strategies)"
1228 color.branch|color.diff|color.interactive|color.status|color.ui)
1229 __gitcomp "always never auto"
1233 __gitcomp "false true"
1238 normal black red green yellow blue magenta cyan white
1239 bold dim ul blink reverse
1251 --global --system --file=
1252 --list --replace-all
1253 --get --get-all --get-regexp
1254 --add --unset --unset-all
1255 --remove-section --rename-section
1260 local pfx="${cur%.*}."
1262 __gitcomp "remote merge mergeoptions" "$pfx" "$cur"
1266 local pfx="${cur%.*}."
1268 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1272 local pfx="${cur%.*}."
1275 url proxy fetch push mirror skipDefaultUpdate
1276 receivepack uploadpack tagopt
1281 local pfx="${cur%.*}."
1283 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1289 branch.autosetupmerge
1290 branch.autosetuprebase
1293 color.branch.current
1304 color.diff.whitespace
1306 color.interactive.header
1307 color.interactive.help
1308 color.interactive.prompt
1312 color.status.changed
1314 color.status.nobranch
1315 color.status.untracked
1316 color.status.updated
1322 core.deltaBaseCacheLimit
1326 core.fsyncobjectfiles
1328 core.ignoreCygwinFSTricks
1330 core.logAllRefUpdates
1331 core.loosecompression
1333 core.packedGitWindowSize
1335 core.preferSymlinkRefs
1338 core.repositoryFormatVersion
1340 core.sharedRepository
1343 core.warnAmbiguousRefs
1346 diff.autorefreshindex
1363 gc.reflogexpireunreachable
1367 gitcvs.dbTableNamePrefix
1377 gui.copyblamethreshold
1381 gui.matchtrackingbranch
1382 gui.newbranchtemplate
1383 gui.pruneduringfetch
1384 gui.spellingdictionary
1400 i18n.logOutputEncoding
1415 mergetool.keepBackup
1417 pack.deltaCacheLimit
1427 receive.denyCurrentBranch
1429 receive.denyNonFastForwards
1432 repack.usedeltabaseoffset
1436 status.relativePaths
1437 status.showUntrackedFiles
1439 transfer.unpackLimit
1450 local subcommands="add rename rm show prune update"
1451 local subcommand="$(__git_find_subcommand "$subcommands")"
1452 if [ -z "$subcommand" ]; then
1453 __gitcomp "$subcommands"
1457 case "$subcommand" in
1458 rename|rm|show|prune)
1459 __gitcomp "$(__git_remotes)"
1462 local i c='' IFS=$'\n'
1463 for i in $(git --git-dir="$(__gitdir)" config --list); do
1481 __git_has_doubledash && return
1483 local cur="${COMP_WORDS[COMP_CWORD]}"
1486 __gitcomp "--merge --mixed --hard --soft"
1490 __gitcomp "$(__git_refs)"
1495 local cur="${COMP_WORDS[COMP_CWORD]}"
1498 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
1502 __gitcomp "$(__git_refs)"
1507 __git_has_doubledash && return
1509 local cur="${COMP_WORDS[COMP_CWORD]}"
1512 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1521 __git_has_doubledash && return
1523 local cur="${COMP_WORDS[COMP_CWORD]}"
1527 $__git_log_common_options
1528 $__git_log_shortlog_options
1529 --numbered --summary
1534 __git_complete_revlist
1539 __git_has_doubledash && return
1541 local cur="${COMP_WORDS[COMP_CWORD]}"
1544 __gitcomp "$__git_log_pretty_formats
1545 " "" "${cur##--pretty=}"
1549 __gitcomp "--pretty=
1550 $__git_diff_common_options
1560 local cur="${COMP_WORDS[COMP_CWORD]}"
1564 --all --remotes --topo-order --current --more=
1565 --list --independent --merge-base --no-name
1566 --sha1-name --topics --reflog
1571 __git_complete_revlist
1576 local subcommands='save list show apply clear drop pop create branch'
1577 local subcommand="$(__git_find_subcommand "$subcommands")"
1578 if [ -z "$subcommand" ]; then
1579 __gitcomp "$subcommands"
1581 local cur="${COMP_WORDS[COMP_CWORD]}"
1582 case "$subcommand,$cur" in
1584 __gitcomp "--keep-index"
1589 show,--*|drop,--*|pop,--*|branch,--*)
1592 show,*|apply,*|drop,*|pop,*|branch,*)
1593 __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
1594 | sed -n -e 's/:.*//p')"
1605 __git_has_doubledash && return
1607 local subcommands="add status init update summary foreach sync"
1608 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1609 local cur="${COMP_WORDS[COMP_CWORD]}"
1612 __gitcomp "--quiet --cached"
1615 __gitcomp "$subcommands"
1625 init fetch clone rebase dcommit log find-rev
1626 set-tree commit-diff info create-ignore propget
1627 proplist show-ignore show-externals branch tag blame
1630 local subcommand="$(__git_find_subcommand "$subcommands")"
1631 if [ -z "$subcommand" ]; then
1632 __gitcomp "$subcommands"
1634 local remote_opts="--username= --config-dir= --no-auth-cache"
1636 --follow-parent --authors-file= --repack=
1637 --no-metadata --use-svm-props --use-svnsync-props
1638 --log-window-size= --no-checkout --quiet
1639 --repack-flags --use-log-author --localtime
1640 --ignore-paths= $remote_opts
1643 --template= --shared= --trunk= --tags=
1644 --branches= --stdlayout --minimize-url
1645 --no-metadata --use-svm-props --use-svnsync-props
1646 --rewrite-root= --prefix= --use-log-author
1647 --add-author-from $remote_opts
1650 --edit --rmdir --find-copies-harder --copy-similarity=
1653 local cur="${COMP_WORDS[COMP_CWORD]}"
1654 case "$subcommand,$cur" in
1656 __gitcomp "--revision= --fetch-all $fc_opts"
1659 __gitcomp "--revision= $fc_opts $init_opts"
1662 __gitcomp "$init_opts"
1666 --merge --strategy= --verbose --dry-run
1667 --fetch-all --no-rebase --commit-url
1668 --revision $cmt_opts $fc_opts
1672 __gitcomp "--stdin $cmt_opts $fc_opts"
1674 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1676 __gitcomp "--revision="
1680 --limit= --revision= --verbose --incremental
1681 --oneline --show-commit --non-recursive
1682 --authors-file= --color
1687 --merge --verbose --strategy= --local
1688 --fetch-all --dry-run $fc_opts
1692 __gitcomp "--message= --file= --revision= $cmt_opts"
1698 __gitcomp "--dry-run --message --tag"
1701 __gitcomp "--dry-run --message"
1704 __gitcomp "--git-format"
1708 --config-dir= --ignore-paths= --minimize
1709 --no-auth-cache --username=
1722 while [ $c -lt $COMP_CWORD ]; do
1723 i="${COMP_WORDS[c]}"
1726 __gitcomp "$(__git_tags)"
1736 case "${COMP_WORDS[COMP_CWORD-1]}" in
1742 __gitcomp "$(__git_tags)"
1748 __gitcomp "$(__git_refs)"
1755 local i c=1 command __git_dir
1757 while [ $c -lt $COMP_CWORD ]; do
1758 i="${COMP_WORDS[c]}"
1760 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1761 --bare) __git_dir="." ;;
1762 --version|-p|--paginate) ;;
1763 --help) command="help"; break ;;
1764 *) command="$i"; break ;;
1769 if [ -z "$command" ]; then
1770 case "${COMP_WORDS[COMP_CWORD]}" in
1782 *) __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
1787 local expansion=$(__git_aliased_command "$command")
1788 [ "$expansion" ] && command="$expansion"
1793 apply) _git_apply ;;
1794 archive) _git_archive ;;
1795 bisect) _git_bisect ;;
1796 bundle) _git_bundle ;;
1797 branch) _git_branch ;;
1798 checkout) _git_checkout ;;
1799 cherry) _git_cherry ;;
1800 cherry-pick) _git_cherry_pick ;;
1801 clean) _git_clean ;;
1802 clone) _git_clone ;;
1803 commit) _git_commit ;;
1804 config) _git_config ;;
1805 describe) _git_describe ;;
1807 fetch) _git_fetch ;;
1808 format-patch) _git_format_patch ;;
1814 ls-files) _git_ls_files ;;
1815 ls-remote) _git_ls_remote ;;
1816 ls-tree) _git_ls_tree ;;
1818 mergetool) _git_mergetool;;
1819 merge-base) _git_merge_base ;;
1821 name-rev) _git_name_rev ;;
1824 rebase) _git_rebase ;;
1825 remote) _git_remote ;;
1826 reset) _git_reset ;;
1827 revert) _git_revert ;;
1829 send-email) _git_send_email ;;
1830 shortlog) _git_shortlog ;;
1832 show-branch) _git_show_branch ;;
1833 stash) _git_stash ;;
1835 submodule) _git_submodule ;;
1838 whatchanged) _git_log ;;
1845 __git_has_doubledash && return
1847 local cur="${COMP_WORDS[COMP_CWORD]}"
1848 local g="$(__gitdir)"
1850 if [ -f $g/MERGE_HEAD ]; then
1856 $__git_log_common_options
1857 $__git_log_gitk_options
1863 __git_complete_revlist
1866 complete -o bashdefault -o default -o nospace -F _git git 2>/dev/null \
1867 || complete -o default -o nospace -F _git git
1868 complete -o bashdefault -o default -o nospace -F _gitk gitk 2>/dev/null \
1869 || complete -o default -o nospace -F _gitk gitk
1871 # The following are necessary only for Cygwin, and only are needed
1872 # when the user has tab-completed the executable name and consequently
1873 # included the '.exe' suffix.
1875 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1876 complete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \
1877 || complete -o default -o nospace -F _git git.exe